错误C2679:二进制'==':找不到哪个操作符采用类型的右操作数

时间:2013-03-10 22:26:25

标签: c++ inheritance operator-overloading

我无法让我的家庭作业正常工作。我已经超载了我的'=='运算符,但我仍然遇到此错误。不确定为什么它被抛出或如何解决它。任何帮助将不胜感激。

这是我的算法:

/* Performs a recursive binary search on the given array. It returns
 * the index of the found value, -1 otherwise. 
 */
template <typename T, typename V>
int binarySearch(T* list[], const V& searchValue,
                 const int firstIndex, const int lastIndex) 
{ 
    if (firstIndex <= lastIndex) 
    {
        int mid = (firstIndex + lastIndex) / 2;  //mid point of list.
        if (searchValue == *list[mid]) 
            return mid;   // found value.
        else if (searchValue < *list[mid]) 
            return binarySearch(list, firstIndex, mid - 1, searchValue);
        else
            return binarySearch(list, mid + 1, lastIndex, searchValue);
    }
    return -1;    //failed to find value
}

调试器说main中的这一行是错误发生的地方:

// Search the person array.
cout << "Searching people array for person with name = 'Mickey Mouse': "
     << (binarySearch(person, "Mickey Mouse", 0, 7) != -1? "found it." : "did not find it.")
     << endl;

这是我的person类头文件,显示了重载的运算符:

#ifndef PERSON_H
#define PERSON_H

#include <string>
#include <iostream>

using namespace std;

namespace P03 {
class Person {...}; // end Person


/* Displays a Person to the screen.
 * Calls the toString() method.
 */
ostream& operator <<(ostream& out, const Person& person)
{
    return out << person.toString();
}

/* The following relational operators compare two instances of the
 * Person class. The comparison is made on the compound value of:
 * <lastName><space><firstName>
 */
bool operator ==(const Person& lhs, const Person& rhs)
{
    return lhs.getName() == rhs.getName();
}

    /*other operators*/
    ...

} // end namespace P03

#endif

不确定是否需要更多代码。如果需要,我会更新。

3 个答案:

答案 0 :(得分:3)

致电时

binarySearch(person, "Mickey Mouse", 0, 7)

binarySearchT person是指针数组的类型,Vconst char*。然后你身体

searchValue == *list[mid]

这是const char*& == *person[x],这就是您收到错误的原因,因为没有operator==(const char*, X) X*person[x]的任何内容。

答案 1 :(得分:0)

您的模板类适用于TV类型。在binarySearch函数中,您可以获取类型T的列表和类型为V的搜索值。然后你比较它们:if (searchValue == *list[mid])。这就是错误所在,因为您可能没有为类==实现T运算符,该运算符接受V类型的参数。

问题可以追溯到cout,您将Person作为T类型传入,const char*作为类型V传递。您的Person类“==运算符仅接受类型为Person的右侧操作数。换句话说,在a == b表达式中,b必须是Person类型。

答案 2 :(得分:0)

if (searchValue == *list[mid])比较const V&amp;类型。用T. V是一个C字符串(char*),假设该人是Person* T的数组,则Person。您提供了const Person&, const Person&比较运算符,但代码需要const char*&, const Person比较运算符。提供这样的运算符,或者从binarySearch(person, "Mickey Mouse", 0, 7)表达式中的字符串创建Person。