2010-08-18 75 views
2

我試圖重載「+」操作符爲我的課:C++超載錯誤+運算結果

Vector operator+(const Vector& a, const Vector& b); 

然而,它告訴我:

vector.h(12): error C2804: binary 'operator +' has too many parameters 

我真的不得到它。請幫助我

+0

您的操作員是否是班級的成員?如果是,請添加類問題的聲明。 – FireAphis 2010-08-18 12:51:59

回答

10

如果您在類中定義了運算符,則它只應接收1個參數。

class Vector { 
    ... 
    Vector operator+ (const Vector& other) const { 
    Vector res = *this; 
    res += other; 
    return res; 
    } 
    ... 
}; 

如果在類定義之外定義它,則使用2參數版本。

class Vector { 
... 
}; 

Vector operator+ (const Vector& first, const Vector& second) { 
    Vector res = first; 
    res += second; 
    return res; 
} 
+1

對於第二種情況,如果不是手動複製使用按值傳遞的第一個參數,則如果第一個參數是臨時參數,則可以讓編譯器有機會優化複製副本。在Vector運算符+(Vector first,Vector const&second); Vector foo(); ... a = foo()+ b;'編譯器知道'foo()'調用的結果是一個臨時的銷燬邊界,所以它可以排列代碼,以便代替第一個參數到'運營商+'並且刪除副本。使用您提出的簽名,編譯器無法避免複製該對象。 – 2010-08-18 12:17:34

1

我猜你是放置類中的代碼,如果是這樣的話,你只需要給1個參數(其它對象),因爲默認情況下this對象是在左側。

3

我相信你已經聲明這是類Vector的成員方法。在這種情況下,它應該只有一個參數,因爲調用該操作符的對象通過this指針暗示可用。 Alternalitevly,你可以聲明這個函數爲Vectorfriend,並帶兩個參數。

0

這是因爲操作員左側的矢量和右側的矢量而不是的第一個和第二個參數。 +之前的那個實際上是this,它自動提供爲Vector *。你只需要一個參數,那就是+運算符右邊的Vector。

這將是正確的:

Vector operator+(const Vector& b); 

您可以通過訪問離開矢量:

(* this) 

...和正確的矢量方式:

b 
0

超載當+運算符只能有一個參數。 另一個參數是 「本」

0

關注KennyTM,要不然讓你充當friend ..

friend Vector operator+(const Vector& a, const Vector& b);

一個例子可以發現here ..

0

具體的錯誤已經在幾個答案中得到了回答。成員方法的單個參數,自由函數版本的兩個參數。但是沒有提示你應該遵循什麼路徑:你應該刪除第一個參數還是使它成爲一個自由函數?

常見的用法是,如果您提供operator+,您可能還想提供operator+=,如果您同時提供這兩種方法,則可以在後者中實施第一種。實施operator+=作爲一個成員函數(完全訪問所有的狀態)和operator+作爲一個自由函數,只需要使用公共operator+=

class MyClass { 
public: 
    MyClass& operator+=(MyClass const & rhs); 
}; 
MyClass operator+(MyClass lhs, MyClass const & rhs) { 
    return lhs+=rhs; 
} 

這種方式,你有操作單個實現,而你可以提供兩種接口(a + ba += b),因此您的接口在幾乎免費的情況下更爲豐富。

+0

有什麼理由來創建一個免費的功能?將操作符+也聲明爲類方法通常不是更好的OO嗎? – sje397 2010-08-18 12:19:20

+0

@ sje397:自由函數運算符關於數據類型是對稱的,而成員方法不可以。考慮可以從類型'T2'隱式轉換的類型'T',以及來自這些類型的兩個對象't'和't2'。如果'T'有一個'operator +'成員方法,那麼't + t2'格式良好並且會調用該運算符,但是't2 + t'將會是一個編譯時錯誤。通過自由函數的實現,這兩個操作都是允許的,並且具有完全相同的含義 - 這可以從另外的假設中得到... – 2010-08-18 12:31:59

+0

編譯器在調用成員方法之前不允許將't2'轉換爲'T' 'T',但允許執行該轉換以匹配函數/方法的參數,如't + t2'中所示。 – 2010-08-18 12:33:59