Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;带有运算符的模板类错误==_C++_Operators_Equals Operator - Fatal编程技术网

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

C++ C++;带有运算符的模板类错误==,c++,operators,equals-operator,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)

错误:
错误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;
}
模板
int indexList::搜索(常量和目标)常量
{
对于(int i=0;i

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

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

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

}
//运算符

bool entry::operator==(const entry&dE)const该问题指的是在该实例中使用的类型T,它没有定义运算符==。从你的问题我猜这是一门“入门”课

也可能是“entry”类没有正确定义运算符==以获取常量entry&作为参数。

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

struct entry {
  bool operator==(const entry& other) const;
};
// or
bool operator==(const entry& lhs, const entry& rhs);
在声明为
const
的函数中,此
指针被视为
const
,这意味着通过该指针使用的所有成员也被视为
const
。如果您的
运算符==()
没有明确指定
const
参数,则会出现此错误


如果无法确保使用的所有Ts都具有正确的
运算符==()
调用,我将删除成员函数模板上的常量说明符。

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


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

默认情况下,用户定义类型的相等运算符未定义。这与模板类无关,而是与
结构
的“条目”有关

因此,在中,您必须重写
结构条目
类条目
中的相等运算符


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

从准确读取错误文本开始:

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

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

entry const e;
if (e == foo)
您已经向我们展示了list类的代码,但这不是错误所在。该错误与
条目
类型(无论是什么类型)缺少运算符有关。为类指定一个
操作符==
函数,或者声明一个独立的
操作符==
函数,该函数接受一个
常量条目&
作为其第一个参数

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

我认为后者是首选的文体。

有时写起来就足够了

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

宾果,也许值得解释一下正确的定义(内联好友函数),或者以后可能会有一些有趣的链接器问题=Dwhy-does-this-does-to-const?因为您的模板方法标记为const。这意味着编译器必须检查您是否没有对模板类中的类(元素[i])的内部数据调用非常量操作==运算符未定义,是否需要?消除此函数上的常量中毒的最佳方法是什么?术语“常量中毒”具有误导性。常量是用来防止你犯错误和保持你的约束有序的。如果在一个地方添加一个常量意味着你需要在其他地方添加它,那么这只意味着你以前应该这样做。我只需要删除标题中声明后面的“const”。您可以为operator==()创建一个启用常量的包装器模板,但这可能会带来更多麻烦。@shoosh:在从头开始构建的层次结构中,我完全同意您的看法。不过,在向现有层次结构添加代码时,“const中毒”是一个恰当的术语。在这些情况下使用const会导致级联编译器错误,需要大量重写。谢谢。我的类确实重载了运算符,但函数没有声明为常量