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

时间:2017-02-25 09:37:33

标签: c++ operator-overloading overloading

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

  

错误C2678:二进制'<':找不到带有' const Syl'类型的左手操作数的运算符(或者没有可接受的转换)'

详细说明,这不编译,并生成编译错误:

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; }

我不知道为什么。我知道那个运营商&lt;是二进制的,但无论如何都要将它作为函数成员重载?

2 个答案:

答案 0 :(得分:3)

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

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

像这样的运算符可以与STL容器一起使用,例如std::map

成员运算符的当前版本在转换为独立运算符时将显示为:

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

请注意const缺少lhs。它本身仍然是正确的,但非典型的。您需要提供l值作为lhs。如果你提供其他东西,你会得到``no operator found found'''错误。 STL std::map也不期望你的错误,可能源于标准头文件,在模板实现的深处。

答案 1 :(得分:2)

假设ab都属于Syl类型,如果a < b为{a,则您的第一个(成员表单)在表达式const中无效{1}},将导致编译错误。

要解决此问题,您需要将成员operator<()指定为

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

如果没有结尾const,则在a < b表达式中,a不能为const(即允许operator<()更改它)。

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

<之类的比较运算符通常不会改变其操作数。 const限定符传达了这一事实。

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