2010-09-20 170 views
0

我想在C++中執行操作符重載; 由於某些原因,編譯不斷給我的錯誤運算符重載C++

error: ‘bool Matrix::operator==(const Matrix&, const Matrix&)’ must take exactly one argument

現在,我知道有一些方法來給它用這一個說法,但我明白,用的朋友,我可以這樣來做,但它仍然無法正常工作。

這是我的代碼,

在此先感謝。

class Matrix{ 
public: 
Matrix(); 
friend bool operator==(Matrix &mtrx1,Matrix &mtrx2); 
friend bool operator!=(Matrix &mtrx1,Matrix &mtrx2); 

protected: 
std::vector<Cell> _matrix; 
int _row; 
int _col; 

}; 

inline bool Matrix::operator==(const Matrix& mtrx1, const Matrix& mtrx2){ 

/* .......... */ 
} 
+1

很好地格式化代碼,用4個空格縮進它,或者選擇它並按下0和1的按鈕。 – 2010-09-20 23:17:03

回答

5

雖然你已經把friend聲明的類裏面,它不是一個成員。因此,函數定義應該是一個非成員:

inline bool operator==(const Matrix& mtrx1, const Matrix& mtrx2) {...} 

還需要const預選賽添加到聲明的參數,以匹配的定義。

+0

我試圖改變它..它仍然給出了同樣的錯誤:( – bass 2010-09-20 23:17:49

+1

但是,請注意,'朋友'聲明強制它是一個非成員,所以即使你在類定義內原地定義它,它真的是一個全球性的功能! – 2010-09-20 23:19:40

+1

@Jerry Coffin:或者更嚴格的說是一個屬於內部命名空間的函數,它包含給定的類 – 2010-09-21 07:25:50

1

如果您在課堂外進行操作,而不是作爲成員函數,則可以使用2個參數進行操作。

當你只需要1個參數的成員函數(另一個參數是*this

+0

...如果你作爲類的一部分實現,你將不需要朋友 – 2010-09-20 23:17:03

8

operator==成員函數聲明:

class foo { 
    public: 
    bool operator==(foo const & rhs) const; 
}; 

operator==全球函數聲明爲:

bool operator==(foo const & lhs, foo const & rhs); 

通常,首先聲明和定義成員函數。然後,全局函數根據成員函數定義爲:

只聲明和定義了成員函數和全局函數之間的函數。有兩個他們是歧義(1)在以下語句

foo f1; 
foo f2; 
bool f1EqualsF2 = (f1 == f2); // (1), ambiguous 

並在這種情況下編譯器返回錯誤。在G ++,錯誤消息看起來像

equals.cpp:24: error: ambiguous overload for ‘operator==’ in ‘f1 == f2’ 
equals.cpp:8: note: candidates are: bool foo::operator==(const foo&) const 
equals.cpp:17: note:     bool operator==(const foo&, const foo&) 

每當operator==完成後,其建議做相應的operator!=

+1

不要忘記方法操作符的const ==() – 2010-09-21 05:43:59

+2

這是錯誤的,一般來說你要麼定義一個成員函數,要麼定義一個自由函數,否則你不應該定義兩個'a == b'一般是含糊不清,自由函數通常是首選,因爲它導致了左和右操作數的一致隱式轉換規則,因爲'operator =='不是'lhs.operator ==(rhs)' -'stst'米ember函數,在'foo'中是'private'。 – 2010-09-21 06:41:23

+0

感謝Martin York和Charles Bailey(+1給他們);我在答案中做了一些更正(在成員函數中添加了'const',並在'public'限定符中添加了'const')。 – Arun 2010-09-21 14:42:34

3
class Matrix{ 
public: 
    Matrix(); 
    friend bool operator==(const Matrix &mtrx1, const Matrix &mtrx2); 
    friend bool operator!=(const Matrix &mtrx1, const Matrix &mtrx2); 

protected: 
    std::vector<Cell> _matrix; 
    int _row; 
    int _col; 
}; 

inline bool operator==(const Matrix& mtrx1, const Matrix& mtrx2){ 
    /* .......... */ 
    return true; 
} 

在Visual Studio 2005中通過編譯。

  1. 省略const限定在你的朋友聲明

  2. 不需要矩陣::在操作==定義