2014-03-24 76 views
0
class CFruit { 
private: 
string m_name; 
public: 

string getName() const; 

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

的水果沙拉是在類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」 的左邊的操作數(或沒有可接受的轉換)

爲什麼會發生此錯誤以及如何解決?

+1

改變第一參數的類型。 –

回答

0

您的+運算符只在類CFruit的兩個實例之間定義。您需要爲CFruitSaladCFruit添加另一個operator +,或使用converting constructor(請參閱選中的答案)。

1
fs = f1 + f2 + f3; 

無論評估的順序(假設f2+ f3首先評估),它首先會返回基於您的聲明這裏的CFruitSalad一個對象:現在

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

,下一個+操作,您要添加CFruit的對象與CFruitSalad的對象,則沒有重載版本,該版本需要一個CFruit和一個CFruitSalad,這會導致該錯誤。

您需要更改重載operator+的實現(如果重載運算符不是真正有意義的話,請勿重載運算符)。

0

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

好的,所以操作時間的順序。

f1 + f2調用operator +並返回CFruitSalad對象,我們將其稱爲_f4

然後_f4 + f3發生,這是試圖撥打operator+ (CFruitSalad const &, CFruit const &),導致您的錯誤。

0

您定義的運算符+作爲

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

即具有返回類型CFruitSalad

二元運算+是evaluared從左到右。因此,在這個聲明中

fs = f1 + f2 + f3; 

評估f1 + f2後,你會得到型CFruitSalad的臨時對象,並嘗試以對象F3已鍵入CFruit添加。但是,您沒有定義左邊的操作數類型爲CFruitSalad的操作符+和類型的右操作數CFruit,並且沒有可以將一種類型的對象轉換爲另一種類型的對象的轉換函數。

所以編譯器發出錯誤。

你可以聲明運營商爲

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

或者可以使它類CFruitSalad的成員函數。例如

CFruitSalad operator +(const CFruit& f2) const; 

另外會有感從`CFruit`到`CFruitSalad`申報operator +=代替操作者+例如

CFruitSalad & operator +=(const CFruit& f2); 
相關問題