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会导致级联编译器错误,需要大量重写。谢谢。我的类确实重载了运算符,但函数没有声明为常量