2013-03-20 134 views
0

我有一個類來做小數計算。我把所有的數學運算符都重載了。它適用於相當簡單的計算,但在需要添加父元素時失敗。例如,在下面的工作都計算並得到正確的結果:錯誤'operator *'不匹配

myClass r, a = 100000, b = 2.5, c = 10, d = 30; 
r = c/d * a * b; 
r = (c/d) * a * b; 

,但如果我改變計算r = a * b * (c/d);編譯失敗:

error: no match for ‘operator*’ in ‘myClass::operator*(myClass&)((* & b)) * myClass::operator/(myClass&)((* & d))’ in gcc 4.6.2. 

我可能失去了一些東西簡單,但找不到它。我究竟做錯了什麼?

+7

我們失去了一些東西很簡單:與運營商的代碼。 – 2013-03-20 19:44:23

+2

我看着我的水晶球,我看到:你的'operator *'或'operator /'或者不是'const',或者它沒有'const'參數。 (注意:這是一個完全瘋狂的猜測,實際上我們需要你的操作符的簽名纔有機會做任何事情,除了做出瘋狂的猜測) – Yakk 2013-03-20 19:48:08

+0

你確定你的'operator /'返回一個'const引用'給結果實例? – Porkbutts 2013-03-20 19:48:10

回答

2

正如大家所猜測的,問題是缺少const限定符。還有一個因素是一個副本被返回而不是參考。

有問題的無效代碼是這樣的:

myClass operator *= (myClass &num) { return Mul(num); } 
myClass operator * (myClass &num) { return Mul(num); } 

的更正:

myClass& operator *= (const myClass &num) { Mul(num); return *this; } 
friend myClass operator * (const myClass &num1, const myClass &num2) { myClass tmp(num1) tmp.Mul(num2); return tmp; }