2013-06-21 1 views
0

해결할 수없는 이상한 오류가 발생합니다.C++ 잘못된 인수입니다. ".."다른 클래스의 Setter

Store.cpp, Store.h (클래스 저장소가 여기에 정의 됨), Order.cpp, Order.h (여기에는 Order 클래스가 정의 됨) 파일이 거의 없습니다.

Store.cpp는 #include "Order.h"입니다. 클래스 Order 내부

내가 공공 부분에 몇 세터와 게터를 가지고, 그 중 하나는 다음과 같습니다

void setStatus(const OrderStatus& orderStatus); 

OrderStatus이 열거입니다.

(*itr).setStatus(ORDER_DONE); 

내가 일식이 오류를 얻을 :

 
    Invalid arguments ' 
    Candidates are: 
    void setStatus(const enum {order.h:140} &) 
    ' 

그리고 GCC에서이 오류 :

나는 다음 줄에 Store.cpp에서 사용하기 위해 노력하고있어 때

 
Store.cpp:250:31: error: no matching function for call to 
âOrder::setStatus(OrderStatus) constâ 
    Store.cpp:250:31: note: candidate is: 
order.h:47:7: note: void Order::setStatus(const OrderStatus&)
order.h:47:7: note: no known conversion for implicit âthisâ parameter from âconst Order*â to âOrder*â

저는 const가 어디에서 왔는지 정말로 모르겠습니다 (250 행).

+0

죄송합니다. 저는 const가 아닌 반복자가 필요합니다. –

+0

이것은 (> = this- ITR orders.begin() :: 반복자를 설정! \t \t \t ITR을 = this-> orders.end(); ++ ITR) 무엇을 사용하여 메신저 .. \t입니다 –

+0

을 @ NadavPeled : 집합은 const 액세스 만 허용합니다. 그렇지 않으면 순서를 완전히 망칠 수 있습니다. – Xeo

답변

3

std::set불변 값 유형을 저장하는 데 사용됩니다. 그렇지 않으면 변경할 때 순서 제약 조건을 위반할 수 있기 때문에 불변이어야합니다.

변경 가능한 을 키와 연관 시키려면 (같은 이유로 불변), 대신 std::map을 사용하십시오. *iterOrder const &을 산출하고 방법은 const를하지 않기 때문에

std::set<Order>::iterator iter = ...; 
iter->setStatus(ORDER_DONE); 

이 작동하지 않습니다 그것의


역학는 점이다.

나는이 문제를 피하기 위해 두 가지 방법으로 언급했으나 둘 다 const 정확성을 전복함으로써 그렇게했다. 나는 그 중 하나를 사용하여 이 아니라을 강력히 추천한다. 그러나, 완성도 :

class Order { 
    mutable OrderStatus status; 
public: 
    void setStatus(OrderStatus s) const { status = s; } 
}; 

이들 중 어느 쪽도 상태가 사용되는 경우 불변 주문 std::set 년대를 깰 수 :

const_cast<Order&>(*iter).setStatus(ORDER_DONE); 

는 주문 클래스 자체를 변경하는 것처럼 그것을 컴파일 할 것 비교. 첫 번째 버전은 "저를 신뢰하십시오"라고 말하면서 const 정확성을 완전히 회피하지만, 두 번째 버전은 상태가 객체 상태의 "실제"부분이 아니며 정렬에 사용되지 않는다고 명시 적으로 전달합니다.

올바른 데이터 구조를 사용하십시오.set의 요소를 변경하려면, 당신은 로컬 복사본에있는 요소를 제거 거기를 수정, 다음에 다시 삽입해야합니다에서

+0

그것은 숙제이며 우리가 사용하도록 요청한 것입니다. 변경 가능하지 않고 작업을 수행하는 유일한 방법은 세트에서 요소를 제거하고 사본을 편집하고 삽입하는 것입니다. –

+1

그게 유일한 정상적인 방법이라고 생각합니다. _everything_을 수정하는 집합을 반복하는 경우 입력 집합을 출력 집합으로 '변환'할 수 있습니다. – Useless

2

,

set들 연약하고 요소가있는 동안 자신의 순서를 변경하지 않는 가정 컨테이너 내에서 요소에 액세스 할 수있는 이유는 const입니다.

관련 문제