运算符==的C ++模板类错误

时间:2009-04-07 15:56:24

标签: c++ operators equals-operator

错误:
错误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);

}

6 个答案:

答案 0 :(得分:9)

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

  

binary'==':找不到带有'const entry'类型的左手操作数的运算符

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

entry const e;
if (e == foo)

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

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

我认为后者是首选的风格。

答案 1 :(得分:6)

问题是指在此实例中使用的类型T没有定义运算符==。我会从你的问题中猜出这是一个班级“入口”。

也可能是'entry'类没有正确定义operator ==来获取const条目&amp;作为参数。

答案 2 :(得分:2)

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

在声明为const的函数中,this指针被视为const,这意味着您通过该指针使用的所有成员也被视为const。如果您所专注的T类型的operator == ()未明确指定const参数,则会出现此错误。

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

答案 3 :(得分:1)

你作为这个类的参数使用的类型T应该有一个operator==(),因为你提供的代码不包含模板的实例化,很难知道什么是错的。

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

答案 4 :(得分:1)

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

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

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

答案 5 :(得分:0)

有时候写

就足够了
...
    if (target == elements[i])
...