小于运算符不能作为成员函数重载

Posted

技术标签:

【中文标题】小于运算符不能作为成员函数重载【英文标题】:Less than operator cannot be overloaded as member function 【发布时间】:2017-07-16 05:06:38 【问题描述】:

我想在map 中使用我的class 作为key,所以我重载了operator+。如果我将它作为友元函数重载,它会很好地工作。当我将它作为类中的成员函数重载时,会导致编译错误。

错误 C2678:二进制“。

详细来说,这不会编译,并产生编译错误:

Syl.h

bool operator< (const Syl& rhs);

Syl.cpp

bool Syl::operator< (const Syl& rhs)   return false; 

编译时。

Syl.h

friend bool operator< (const Syl& lhs, const Syl& rhs);

Syl.cpp

bool operator< (const Syl& lhs, const Syl& rhs)    return false; 

我不知道为什么。我知道 operator

【问题讨论】:

由于重载解析和隐式转换的工作方式,friend 版本是一个更好的主意。 友好版本指定,两个操作数都为const,另一个版本只表示输入参数为const。你必须把方法标记为……你必须仔细阅读错误,特别注意constsigned等词的含义。 【参考方案1】:

通常,operator&lt; 等成员运算符不会修改它们所操作的对象。如果是这种情况,您需要通过将关键字 const 放在声明的末尾来指定该方法是常量,即

class Syl 
  ...
  public:
  bool operator<(const Syl& rhs) const;  

这样的运算符可以与 std::map 等 STL 容器一起使用。


您当前版本的成员运算符,当翻译成独立运算符时将如下所示:

friend bool operator<(Syl& lhs, const Syl& rhs);

注意lhs 缺少const。它本身仍然是正确的,但不典型。您需要提供一个左值lhs。如果您提供其他内容,则会收到 ``no operator found...'' 错误。 STL std::map 也不希望这样,因此您的错误可能源于标准标头,位于模板实现的深处。

【讨论】:

所以编译时错误不是来自他声明重载运算符的方式,而是来自成员重载运算符用于订购只接受重载&lt;运算符的映射如果它的两个参数都是 const ? 是的,就是这样。 这是正确的 - 操作员不需要是const。有些通常不是(例如operator=),有些通常是。但请注意,非常量运算符需要 lvalue 作为左参数,如果不提供,您将收到类似的错误。 感谢非常详细的解释。【参考方案2】:

假设ab 都是Syl 类型,如果aconst,则您的第一个(成员表单)在表达式a &lt; b 中无效,并且会导致编译错误.

要解决这个问题,您需要将成员 operator&lt;() 指定为

bool operator< (const Syl& rhs) const;    // note the trailing const

如果没有尾随 const,在表达式 a &lt; b 中,a 不能是 const(即允许 operator&lt;() 更改它)。

您的第二种形式是正确的,因为它指定两个操作数都是const 引用。

&lt; 等比较运算符通常不会更改其操作数中的任何一个。 const 限定词传达了这一事实。

请记住,您可以提供会员表格或非会员表格。两者都提供会由于歧义而导致错误(当编译器看到像a &lt; b 这样的表达式时,编译器没有理由优先选择其中一个)。

【讨论】:

以上是关于小于运算符不能作为成员函数重载的主要内容,如果未能解决你的问题,请参考以下文章

重载运算符问题

重载运算符作为成员函数还是非成员函数

运算符重载(作为成员函数)

运算符重载三种形式(成员函数,友元函数,普通函数)详解

运算符重载的函数作为类的成员函数和友元函数

运算符重载