5

错误:
错误 C2678:二进制“==”:未找到采用“const entry”类型的左侧操作数的运算符(或没有可接受的转换)

功能:

template <class T, int maxSize>
int indexList<T, maxSize>::search(const T& target) const
{
    for (int i = 0; i < maxSize; i++)  
        if (elements[i] == target)   //ERROR???
            return i;       // target found at position i

    // target not found
    return -1;
}

indexList.h
indexList.cpp

这假设是一个重载的运算符吗?作为一个模板类,我不确定我是否理解错误?

解决方案- 类中的重载函数现在声明为 const:

//Operators
bool entry::operator == (const entry& dE)  const <--
{
    return (name ==dE.name);

}
4

6 回答 6

9

首先完全按原样阅读错误文本:

二进制 '==' :没有找到接受“const entry”类型的左操作数的运算符

这意味着它找不到任何==接受entry类型作为其左操作数的运算符。此代码无效:

entry const e;
if (e == foo)

您已经向我们展示了您的列表类的代码,但这不是错误所在。该错误是关于缺少该entry类型的运算符,无论是什么。要么给类一个operator==函数,要么声明一个operator==接受 aconst entry&作为其第一个参数的独立函数。

struct entry {
  bool operator==(const entry& other) const;
};
// or
bool operator==(const entry& lhs, const entry& rhs);

我认为后者是首选风格。

于 2009-04-07T16:06:59.127 回答
6

问题是指在此实例中使用的类型 T 没有定义 operator==。我从你的问题中猜想这是一个类“条目”。

也可能是 'entry' 类没有正确定义 operator== 以将 const entry& 作为参数。

于 2009-04-07T16:01:30.310 回答
2

这很可能是“const中毒”,您const在搜索函数声明中的使用将迫使您添加const您调用的所有下游函数的版本。

在声明的函数const中,this会考虑指针const,这意味着您通过该指针使用的所有成员也会被考虑const。如果您operator == ()对任何类型的 T 进行专门研究没有明确指定const参数,您将收到此错误。

如果您不能确保您使用的所有 T 都会有正确的operator == ()调用,我会删除成员函数模板上的 const 说明符。

于 2009-04-07T16:02:17.547 回答
1

您用作此类参数的类型 T 应该有一个,operator==()因为您提供的代码不包含模板的实例化,因此很难知道出了什么问题。

另一方面,模板的函数定义应与类一起在 .h 文件中,否则编译器将无法正确实例化它。

于 2009-04-07T16:02:45.703 回答
1

默认情况下未定义用户定义类型的相等运算符。这与您的模板类没有任何关系,而是您的structclass“条目”。

因此,您必须覆盖struct entryor中的相等运算符class entry

或者,如果您不想强制使用该模板的所有内容定义相等运算符,则可以修改模板接口以接受进行相等比较的 Comparator。

于 2009-04-07T16:05:06.040 回答
0

有时候写就够了

...
    if (target == elements[i])
...
于 2009-04-07T16:44:57.910 回答