【问题标题】:C++ template class error with operator ==运算符 == 的 C++ 模板类错误
【发布时间】:2010-10-18 02:35:33
【问题描述】:

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

}

【问题讨论】:

标签: c++ operators equals-operator


【解决方案1】:

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

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

【讨论】:

  • Bingo,可能值得解释正确的定义(内联友元函数),或者稍后可能会有一些 FUN 链接器问题 =D
  • 为什么元素必须是 const?
  • 因为你的模板方法被标记为 const。这意味着编译器必须检查您没有对类的内部数据调用非常量操作 (element[i])
【解决方案2】:

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

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

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

【讨论】:

  • 模板类中没有定义==操作符,需要吗?消除此函数上的 const 中毒的最佳方法是什么?
  • 术语“const 中毒”颇具误导性。 consts 可以防止你犯错误并保持你的约束有序。如果在一个地方添加 const 意味着您需要在其他地方添加它,那只意味着您可能以前应该这样做过。
  • 我只是删除标题中声明之后的“const”。您可以为 operator == () 创建一个启用 const 的包装器模板,但这可能比它的价值更麻烦。
  • @shoosh:我完全同意你的观点。但是,在将代码添加到现有层次结构时,“const 中毒”是一个恰当的术语。在这些情况下使用 const 会导致需要大量重写的级联编译器错误。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

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

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

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

    【讨论】:

      【解决方案5】:

      首先阅读原样的错误文本:

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

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

      entry const e;
      if (e == foo)
      

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

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

      我认为后者是首选风格。

      【讨论】:

      • 谢谢。我的类确实重载了运算符,但该函数没有声明为 const
      【解决方案6】:

      有时候写就够了

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-11
        • 2020-03-27
        • 1970-01-01
        相关资源
        最近更新 更多