我已定义了一个类似
的类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);
}
我该如何解决?
答案 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}}按字典顺序比较对中的值,就像我上面所做的那样,即将first
与second
和second
与operator==
进行比较。如果您需要以不同方式对它们进行比较,则只提供您自己的特定定义(非模板版本)。
如果您需要为定义的类型实现{{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);
^^^^^^