operator == overloading考虑非静态成员函数

时间:2013-01-20 09:38:12

标签: c++ operator-overloading

我已定义了一个类似

的类
using namespace std;
class foo {
public:
  typedef std::pair< int, int > index;
  bool operator == ( const index &l, const index &r )
  {
    return (l.first == r.first && l.second == r.second);
  }
  void bar()
  {
    index i1;
    i1.first = 10;
    i1.second = 20;
    index i2;
    i2.first = 10;
    i2.second = 200;
    if (i1 == i2)
       cout << "equal\n";
  }
};

但是我在Windows中遇到了这个错误

error C2804: binary 'operator ==' has too many parameters

和linux中的这个错误

operator==(const  std::pair<int, int>&, const std::pair<int, int>&)’ must take exactly one argument

我发现了这个主题overloading operator== complaining of 'must take exactly one argument',并且似乎是类中静态和非静态函数的问题。但是我不知道如何申请this

例如,这不正确

  bool operator == ( const index &r )
  {
    return (this->first == r.first && this->second == r.second);
  }

我该如何解决?

4 个答案:

答案 0 :(得分:4)

operator==可以通过两种方式实现:

  • 作为成员函数:在这种情况下,该函数接受一个参数,并在左操作数上调用,该操作数作为this指针隐式传递给函数。
  • 作为非成员函数,在这种情况下,函数接受两个参数,即左右操作数。

由于您为operator==实施std::pair,因此无法将其实现为std::pair的成员函数。您剩下的选项是非成员函数。

所以在课外实现它:

bool operator==(std::pair<int,int> const & l, std::pair<int,int> const & r)
{
    return (l.first == r.first && l.second == r.second);
}

但是,除非您想以不同方式实施,否则您不需要自己实施。标准库已为operator==提供了std::pair first {1}}按字典顺序比较对中的值,就像我上面所做的那样,即将firstsecondsecondoperator==进行比较。如果您需要以不同方式对它们进行比较,则只提供您自己的特定定义(非模板版本)。

如果您需要为定义的类型实现{{1}},上述要点值得注意。

答案 1 :(得分:3)

您需要将operator==移出类foo:

bool operator == ( const foo::index &l, const foo::index &r )
{
  return (l.first == r.second && l.second == r.second);
}

class foo {
public:
   typedef std::pair< int, int > index;
  void bar()
  {
    index i1;
    i1.first = 10;
    i1.second = 20;
    index i2;
    i2.first = 10;
    i2.second = 200;
    if (i1 == i2)
       cout << "equal\n";
  }
};

另请注意,std::pair已经超载operator==,请参阅:link,如果有必要,您可以重新考虑重新编写自己的内容。

答案 2 :(得分:2)

如果在类中重载==运算符,它应该只接受一个参数,以便可以在当前对象和参数之间进行比较。

答案 3 :(得分:2)

您可以将该运算符移出类,这样您就可以使用2个操作数。实际上,此时没有必要将它保留在类中,因为您只是比较成员变量而不是类本身。

如果pair已经定义了您编写的运算符,我确实不会感到惊讶。

编辑:是的看起来像pair already implements this

  

如果两个对象中的第一个元素相互比较,并且两个第二个元素的比较相等,则两个对象的比较相等 - 它们都必须匹配。

P.S。我想你的意思是

return (l.first == r.first && l.second == r.second);
                    ^^^^^^