2013-01-20 45 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留在原來的位置,並在函數中限定名字? –