2009-04-07 117 views
5

错误:
错误C2678:二进制“==”:没有操作员发现它采用类型“const的条目”的左边的操作数(或没有可接受的转化率)C++模板类误差与运算符==

功能:

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

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

溶液 - 在类现在声明为常量的过载功能:

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

} 
+0

http://stackoverflow.com/a/38887476/1599699 – Andrew 2016-08-11 04:52:26

回答

9

开始通过阅读错误的文字,正是因为它是:

binary '==' : no operator found which takes a left-hand operand of type '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); 

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

6

问题指的是在这种情况下被使用不具有==限定的操作者的类型T。我会从你的问题中猜测这是一个“入口”类。

也可能是'entry'类没有正确定义运算符==以将const条目&作为参数。

+0

宾果,可能是值得解释的正确定义,但(内联友元函数)或有可能是一些* FUN *链接器问题以后= D – 2009-04-07 16:03:23

+0

为什么元素必须是const? – 2009-04-07 16:03:48

+0

因为你的模板方法被标记为const。这意味着编译器必须检查你是否不对该类的内部数据调用非const操作(element [i]) – 2009-04-07 16:05:21

2

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

在函数声明const,该this指针被认为是const,这意味着您使用的所有成员通过该指针被认为const为好。如果您的operator ==()对于您所擅长的任何类型T没有明确指定const参数,则会出现此错误。

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

+0

在模板类中,==运算符未定义,它是否需要?在这个函数中删除这个const中毒的最好方法是什么? – 2009-04-07 16:05:27

1

由于您提供的代码不包含模板的实例化,因此您很难知道哪里出了问题,因此您用作此类的参数的类型T应该有operator==()

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

1

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

因此,您必须覆盖struct entryclass entry中的相等运算符。或者,如果您不想强制使用该模板的所有内容来定义相等运算符,则可以修改模板接口以接受执行相等比较的Comparator。

0

有时是很不够写

... 
    if (target == elements[i]) 
...