得到一个我无法解决的奇怪错误。
我有几个文件,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行)。
答案 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
。