运算符重载错误“二进制'+':找不到哪个运算符取左手操作数”

时间:2014-03-24 18:31:54

标签: c++ operators operator-overloading

class CFruit { 
private: 
 string m_name; 
public: 

 string getName() const; 

 CFruit(string name = "NoName"); 
};

fruitsalad在CFruitSalad类中表示:

class CFruitSalad { 
//Overloaded Operators 
friend ostream& operator <<(ostream& out, const CFruitSalad& f); 
friend CFruitSalad operator +(const CFruit& f1, const CFruit& f2); 

private: 
 string m_fruitsalad; 
public: 

 CFruitSalad(string content = ""); 
 string getName() const; 
};

现在,当我使用写这个:

 CFruit f1("Apple"); 
 CFruit f2("Orange"); 
 CFruit f3 ("Banana"); 
 CFruitSalad fs; 
 fs = f1 + f2 + f3; //this line generates the error 
 cout << "Content: " << fs << endl; 

编译程序时收到以下错误: 错误C2678:二进制'+':找不到哪个运算符带有'CFruitSalad'类型的左操作数 (或者没有可接受的转换)

为什么会出现此错误以及如何解决?

4 个答案:

答案 0 :(得分:1)

  fs = f1 + f2 + f3; 

无论评估顺序如何(首先评估f2+ f3),它将首先根据您在此处的声明返回CFruitSalad的对象:

friend CFruitSalad operator +(const CFruit& f1, const CFruit& f2);

现在,对于下一个+操作,您要添加一个CFruit对象,其对象为CFruitSalad,您没有一个需要一个{{1}的重载版本}和一个CFruit,导致错误。

您需要更改重载CFruitSalad的实现(如果IMHO不是真的有意义,请不要重载运算符。)

答案 1 :(得分:0)

您的+运算符仅在类CFruit的两个实例之间定义。您需要为operator +CFruitSalad添加另一个CFruit,或使用converting constructor(请参阅已选中的答案)。

答案 2 :(得分:0)

fs = f1 + f2 + f3; //this line generates the error

好的,所以操作时间顺序。

f1 + f2调用operator +并返回一个CFruitSalad对象,我们将其称为_f4

然后发生了_f4 + f3,它试图调用operator+ (CFruitSalad const &, CFruit const &),导致您的错误。

答案 3 :(得分:0)

您将operator +定义为

friend CFruitSalad operator +(const CFruit& f1, const CFruit& f2); 

具有返回类型 CFruitSalad

二元运算符+从左到右进行计算。所以在这个声明中

fs = f1 + f2 + f3;

在评估f1 + f2后,您会获得 CFruitSalad 类型的临时对象,并尝试使用类型为 CFruit 的对象f3添加它。但是你没有定义operator +具有 CFruitSalad 类型的左操作数和类型 CFruit 的右操作数,并且没有转换函数可以转换一种类型的对象到另一个。

因此编译器会发出错误。

您可以将运营商声明为

friend CFruitSalad operator +(const CFruitSalad& f1, const CFruit& f2); 

或者可以使它成为CFruitSalad类的成员函数。例如

CFruitSalad operator +( const CFruit& f2) const; 

还有一种感觉是声明operator +=而不是运算符+例如

CFruitSalad & operator +=( const CFruit& f2);