C ++无效的参数,候选者是:来自不同类的Setters上的“..”

时间:2013-06-21 11:55:08

标签: c++ compiler-errors

得到一个我无法解决的奇怪错误。

我有几个文件,Store.cpp,Store.h(此处定义了类存储),Order.cpp,Order.h(此处定义了类Order)。

Store.cpp有#include "Order.h"

在班级Order里面,我在公共部分有几个安装者和吸气者,其中一个是:

void setStatus(const OrderStatus& orderStatus);

OrderStatus是一个枚举。

当我尝试在Store.cpp中使用它时,使用以下行:

(*itr).setStatus(ORDER_DONE);

我从eclipse中得到这个错误:

    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行)。

2 个答案:

答案 0 :(得分: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正确性,而第二个版本明确表示状态不是对象状态的“真实”部分,不会用于排序。

说真的,请改用正确的数据结构。

答案 1 :(得分:2)

为了更改set的元素,您必须将元素删除到本地副本,在那里修改它,然后将其重新插入,

set是脆弱的,并假设元素在容器内不会改变它们的顺序,这就是为什么对元素的访问是const