C ++ [错误]不匹配'运算符==' (操作数类型是' Vehicle'' const Vehicle')

时间:2016-01-27 23:21:02

标签: c++

我正在为我的学校做一个项目(我还是初学者),我遇到了以下问题:

"[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;
}

waitingListVehicle个对象的向量。

我搜索过但无法找到答案,即使我有很多类似的问题我尝试了一切,但没有任何效果。 提前谢谢。

2 个答案:

答案 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.