C ++无效参数,候选者是:来自不同类的Setter上的“..”
Posted
技术标签:
【中文标题】C ++无效参数,候选者是:来自不同类的Setter上的“..”【英文标题】:C++ Invalid arguments, Candidates are : ".." on Setters from different classes 【发布时间】:2013-06-21 11:55:07 【问题描述】:遇到一个我无法解决的奇怪错误。
我的文件很少,Store.cpp、Store.h(此处定义了类Store)、Order.cpp、Order.h(此处定义了类Order)。
Store.cpp 有#include "Order.h"
。
在 Order
类中,我在 public 部分有一些 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 行)。
【问题讨论】:
糟糕,抱歉,我的意思是你需要一个非常量迭代器。 这就是我使用的.. for(setstd::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
的排序不变性。第一个版本说“请相信我”并完全回避 const 正确性,而第二个版本明确表示状态不是对象状态的“真实”部分,不会用于排序。
说真的,请改用正确的数据结构。
【讨论】:
这是家庭作业,set 是我们被要求使用的。所以让它在不可变的情况下工作的唯一方法是从 set 中删除元素,编辑它的副本,然后插入?跨度> 我怀疑这是唯一理智的方法,是的。如果您正在迭代修改所有内容的集合,您可以将输入集合transform
转换为输出集合。【参考方案2】:
要更改set
的元素,您必须将元素移除到本地副本,在那里修改,然后重新插入,
set
s 是脆弱的,假设元素在容器中不会改变它们的顺序,这就是为什么访问元素是const
。
【讨论】:
以上是关于C ++无效参数,候选者是:来自不同类的Setter上的“..”的主要内容,如果未能解决你的问题,请参考以下文章