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'类型的左操作数 (或者没有可接受的转换)
为什么会出现此错误以及如何解决?
答案 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);