2013-06-21 44 views
0

獲得我無法解決的奇怪錯誤。我有幾個文件,Store.cpp,Store.h(類存儲定義在這裏),Order.cpp,Order.h(類定義在這裏定義)。C++無效的參數,候選人是:「..」來自不同類的Setters

Store.cpp有#include "Order.h"

Order裏面我有在公共部分有一些getter和setter方法,其中之一是:

void setStatus(const OrderStatus& orderStatus); 

OrderStatus是一個枚舉。

當我試圖在Store.cpp與以下行使用它:

(*itr).setStatus(ORDER_DONE); 

我從日食出現此錯誤:

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

而且從GCC這個錯誤:

 
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

這就是即時通訊使用.. \t的(設置:迭代ITR =這個 - > orders.begin(!); \t \t \t ITR =這個 - > orders.end(); ++ ITR) –

+0

@ NadavPeled:設置只允許const訪問,否則你可能完全打亂了排序。 – Xeo

回答

3

std::set用於存儲不可變的值類型。它們必須是不可變的,因爲否則當你改變它們時你可以打破排序約束。

如果要將可變的的值與某個鍵(由於相同原因而不可變)關聯,請改爲使用std::map


它的機制是:

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

不起作用,因爲*iter產生Order const &和你的方法是不是常量。

我在評論中提到了兩種避免此問題的方法,但它們都是通過顛覆const的正確性來實現的,我強烈建議使用而不是使用。但是,對於完整性:

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

將使編譯,因爲會改變Order類本身:

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

要麼這些也可以打破std::set的,如果狀態在使用排序不變比較。第一個版本是說「只信任我」並且完全避開const正確性,而第二個版本明確表示狀態不是對象狀態的「真實」部分,不會用於排序。

說真的,請改用正確的數據結構。

+0

它的作業和設置是我們被要求使用.. 因此,使其工作不可變的唯一方法是從設置中刪除元素,編輯它的副本,並插入? –

+1

我懷疑這是唯一的理智方式,是的。如果您正在遍歷修改_everything_的集合,則可以將輸入集合「轉換」爲輸出集合。 – Useless

2

爲了改變set的元素,必須刪除元素到本地拷貝,修改它在那裏,然後將它裝回,

set s爲脆弱的,假設的元素不改變它們的順序而在容器內,這就是爲什麼訪問元素是const