2013-01-20 43 views
3

我已经定义了这样的==操作符重载考虑非静态成员函数

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

类不过,我得到的窗口

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

我该如何解决呢?

+1

已经std :: pair没有得到一个==操作符? –

回答

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

但你并不真的需要自己实现它,除非你想以不同的方式实现它。标准库已经为std::pair其字典顺序该对中的值进行比较,如我上面那样,即比较用firstfirstsecond提供secondoperator==一个generic version。如果您需要以不同的方式进行比较,请提供您自己的特定定义(非模板版本)。

以上提到的几点值得注意,如何在需要时为您的定义类型实施operator==

+2

请不要这样做。 'std :: pair'已经有了一个通用的'operator =='重载,它可以做到明智的事情(先比较第一个,第二个比较第二个)。只需创建自己的持有两个整数的结构,而不是'std :: pair '的typedef。 –

+0

@ BenjaminLindley:是的。我写了这个。 – Nawaz

+0

谢谢我不知道 – mahmood

2

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

+0

那么'return'语句是什么样的呢? – mahmood

2

您可以将该操作员移出课程,这样您可以携带2个操作数。事实上,在这一点上没有必要把它放在类中,因为你只是比较成员变量而不是类本身。

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

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

两对对象进行了比较平等的,如果在这两个对象的第一要素比较彼此相等,并且两个第二元素也比较彼此相等的 - 他们都必须比赛。

p.s.我觉得你的意思

return (l.first == r.first && l.second == r.second); 
        ^^^^^^ 
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,你可能会在必要时编写自己的反思再次。

+0

显然,你正在改变索引的名字。为什么不把typedef留在原来的位置,并在函数中限定名字? –