2017-03-19 172 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