0

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

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

Store.cpp 有#include "Order.h".

在课堂Order上,我在公共部分有一些 setter 和 getter,其中之一是:

void setStatus(const OrderStatus& orderStatus);

OrderStatus 是一个枚举。

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

(*itr).setStatus(ORDER_DONE);

我从 eclipse 得到这个错误:

    无效参数 '
    候选人是:
    void setStatus(const enum {order.h:140} &)
    '

来自 GCC 的这个错误:

Store.cpp:250:31:错误:没有匹配的调用函数
âOrder::setStatus(OrderStatus) constâ
   Store.cpp:250:31: 注意: 候选是: 
order.h:47:7: 注意: void Order::setStatus(const OrderStatus&)
order.h:47:7: 注意:从 âconst Order*â 到 âOrder*â 的隐式 âthisâ 参数没有已知的转换

我真的不知道 const 来自哪里(第 250 行)。

4

2 回答 2

3

std::set用于存储不可变值类型。它们必须是不可变的,否则当你改变它们时你可以打破排序约束。

如果您想将可变与键关联(出于相同原因,它是不可变的),请std::map改用。


它的机制是:

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

不起作用,因为*iter产量Order const &和您的方法不是 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如果在比较中使用状态,这些中的任何一个也可能破坏's ordering invariant。第一个版本说“相信我”并完全回避 const 正确性,而第二个版本明确表示状态不是对象状态的“真实”部分,不会用于排序。

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

于 2013-06-21T12:12:08.917 回答
2

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

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

于 2013-06-21T12:12:24.327 回答