4

我已经定义了一个这样的类

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

我发现这个主题重载 operator== 抱怨“必须只采用一个参数”,并且似乎是类中静态和非静态函数的问题。但是不知道怎么申请this

例如,这是不正确的

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

我该如何解决?

4

4 回答 4

5

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

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

由于您正在实现operator==for std::pair,因此您不能将其实现为成员函数(of 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==比较with和with 。如果您需要对它们进行不同的比较,请提供您自己的特定定义(非模板版本)。std::pairfirstfirstsecondsecond

上面提到的几点是值得注意的,operator==当您需要它用于定义的类型时如何实现。

于 2013-01-20T09:44:40.433 回答
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==,请参阅:链接,如果有必要,您可以重新考虑重新编写自己的。

于 2013-01-20T09:45:47.123 回答
2

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

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

编辑:是的,看起来pair已经实现了这个

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

ps 我想你的意思是

return (l.first == r.first && l.second == r.second);
                    ^^^^^^
于 2013-01-20T09:45:02.103 回答
2

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

于 2013-01-20T09:40:56.120 回答