我正在为我的学校做一个项目(我还是初学者),我遇到了以下问题:
"[Error] no match for 'operator==' (operand types are 'Vehicle' and 'const Vehicle')"
Vehicle
是我项目中的一个类。
这就是给我错误的原因:
int DayLog::findWaitingPosistion(Vehicle const& v){
if (find(waitingList.begin(),waitingList.end(),v) != waitingList.end())
return 1;
}
waitingList
是Vehicle
个对象的向量。
我搜索过但无法找到答案,即使我有很多类似的问题我尝试了一切,但没有任何效果。 提前谢谢。
答案 0 :(得分:4)
错误信息非常明确:编译器正在寻找比较两辆车的operator ==函数。这种方法的签名是存在的,就像
bool operator==(const Vehicle& first, const Vehicle& second);
为什么发生这种情况并不明确。毕竟,您不要在代码中的任何位置使用==运算符!糟糕的编译器 - 抱怨你甚至没做过的事情。
要了解发生了什么,您必须了解“查找”方法。这是一个模板方法,在C ++模板中几乎是超级花哨的文本查找和替换(警告:大规模简化!)。 “find”的代码将在编译器运行之前为您正在使用的类型即时生成。
您可以查看如何实施查找here。万一cplusplus.com下线,我已经将相关部分包括在*:
之下template<class InputIterator, class T>
InputIterator find (InputIterator first, InputIterator last, const T& val)
{
while (first!=last) {
if (*first==val) return first; //<--- Notice the == operator
++first;
}
return last;
}
那是==来自哪里!编译器将自动生成您指定类型(车辆)的查找代码。然后当它进行编译时,生成的代码尝试使用运算符==但是没有一个用于车辆。你将不得不提供一辆车。
*严肃地说 - check out that website。它向您展示了所有这些东西是如何工作的。
答案 1 :(得分:3)
使用find的最低要求是指定的operator==
函数。这是std::find
在它找到你的类型时迭代遍历向量时使用的内容。
这样的事情是必要的:
class Vehicle {
public:
int number;
// We need the operator== to compare 2 Vehicle types.
bool operator==(const Vehicle &rhs) const {
return rhs.number == number;
}
};
这将允许您使用find。查看live example here.