2017-03-19 179 views
2

我在主要部分找不到'操作員+'錯誤。 我作爲朋友超載所有的運營商,除了= 我試圖調試,但無法弄清楚 我不知道,我在跳過。 請指教。操作員超載錯誤「與操作員錯誤不匹配」

#include <iostream> 
using namespace std; 

class fraction 
{ 
long num; 
long den; 
public: 
fraction(){num = 0L ; den = 1L ;} 
fraction(long l_num,long l_den){num = l_num ; den = l_den ;} 
fraction(const fraction& f){num=f.num; den=f.den;} 
~fraction (){} 
long getNum (void) const{return num ;} 
long getDen (void) const{return den ;} 
void print(void) 
{ 
if(den==0)den=1L; 
cout<<num<<"/"<<den <<endl; 
} 
fraction inc () 
{ 
long numX = (num) + (den); 
long denY = (den); 
return fraction(numX, denY); 
} 
friend fraction operator +(fraction &f1 , fraction &f2); 
friend fraction operator +(int i, fraction &f2); 
friend fraction &operator++(fraction & f1); 
fraction operator =(const fraction &f); 
friend fraction operator -(fraction &f1 , fraction &f2); 
friend fraction operator *(fraction &f1 , fraction &f2); 
friend fraction operator /(fraction &f1 , fraction &f2); 
}; 
inline fraction operator +(fraction &f1, fraction &f2) 
{ 
fraction temp; 
temp.num=(f1.num*f2.den)+(f1.den*f2.num); 
temp.den=f1.den*f2.den; 
return temp; 
} 
inline fraction operator +(int i, fraction &f2) 
{ 
fraction temp; 
temp.num=i*f2.den+f2.num; 
temp.den=f2.den; 
return temp; 
} 
inline fraction &operator++(fraction& f1) 
{ 
f1.num=f1.num+f1.den; 
return f1; 
} 
inline fraction fraction::operator=(const fraction &f) 
{ 
num=f.num; 
den=f.den; 
return*this; 
} 
inline fraction operator -(fraction &f1, fraction &f2) 
{ 
fraction temp; 
temp.num=(f1.num*f2.den)-(f1.den*f2.num); 
temp.den=f1.den*f2.den; 
return temp; 
} 
inline fraction operator *(fraction &f1, fraction &f2) 
{ 
fraction temp; 
temp.num=f1.num*f2.num; 
temp.den=f1.den*f2.den; 
return temp; 
} 
inline fraction operator /(fraction &f1 , fraction &f2) 
{ 
fraction temp; 
temp.num=f1.num*f2.den; 
temp.den=f1.den*f2.num; 
return temp; 
} 
int main () 
{ 
fraction f1, f2(2L,0L); 
fraction f3(f2); 
f1.print(); 
f2.print(); 
f3.print(); 
f3 = f3 + fraction (-5 , 4); 
f1 = f2 + f3; 
f1.print (); 
f1 = f2 - f3; 
f1.print(); 
f1 = f2 * f3; 
f1.print(); 
(++ (++f1)).print(); 
f1 = f2/f3; 
f1.print(); 
f1 = 5 + f1; 
f1.print(); 
return 0; 
} 
+1

縮進請 – Sniper

回答

0

所有的操作符都將其參數作爲非const的參考fraction。這意味着它們只能使用fraction類型的非常量左值來調用。臨時(如fraction(-5, 4)的結果)是右值,而不是左值,因此不能用作操作員的參數。

我敢說這是錯誤算術運算符將非const引用作爲參數:它表示它們將修改它們的操作數,這是明顯錯誤的。您應該將所有二元運算符的參數從fraction &更改爲const fraction &

const的引用允許rvalues綁定它,所以你的代碼將按預期工作。

當然,這不適用於operator++(這就是爲什麼我提到二進制以上操作符)。 ++實際上修改了它的操作數,所以在這種情況下,對非const的引用是正確的方法。這同樣適用於複合賦值運算符,如+=

+0

你說得對,我忘了做

可能會奏效。非常感謝您的輸入 – mwater07

0

此行是造成你正在使用fraction operator +(fraction &f1 , fraction &f2);功能添加一個對象,一個匿名對象的所有錯誤

f3 = f3 + fraction (-5 , 4) 

但匿名對象只是暫時的。閱讀this的答案。

刪除該行,您的代碼應該工作。

編輯:如果你改變

fraction operator +(fraction &f1 , fraction &f2);

fraction operator +(fraction &f1 , fraction f2);

+0

這是治療症狀,而不是疾病。 – Angew

+0

我的意思是刪除它並創建另一個對象,然後通過它添加。 – Sniper

+0

同樣的問題。算術運算符首先需要左值嗎? – Angew