2013-02-09 55 views
2

我一直試圖超載>>操作符。我有兩個私有變量的類:no operator >>與這些操作數匹配

Class Complex 
{ 
private: 
    double real; 
    double imaginary; 
}; 

另外我有重載友元函數的>>操作:

friend istream & operator>>(istream &is, Complex &c) 

在功能的實現我試過很多方法寫入對象c的變量,但我不斷收到錯誤no operator >> matches these operands

我環顧四周,看到我需要寫入變量的reference,所以我嘗試了以下ng:

istream & operator>>(istream &is, Complex &c) 
{ 
using std::cout; 
double &r = c.real; 
cout << "real: " <<is>> r; 
    return is; 
} 

但是,這仍然給我同樣的錯誤。 我有點困惑,因爲我試過is >> c.real並沒有工作。

在類似的SO問題的答案之一,有人建議寫入到一個局部變量,將對象變量設置它,像:

double d; 
cin >> d; 
setReal(d); 

我試圖找到一個更簡單的方法實現這一點而不是使用方法或將變量設置爲本地變量。

該解決方案可能是一個簡單的解決方案,但我真的只是一個C++的初學者,所以請把它放在我身上:P。

測試用例:

using std::cin; 
Complex c; 
cin >> c; 

精確錯誤消息:

Error 1 error C2678: binary '>>' : no operator found which takes a left-hand operand of type 'std::basic_ostream<_Elem,_Traits>' (or there is no acceptable conversion) 
+3

你能構建一個[最小測試用例](http://sscce.org)嗎?目前,還不清楚錯誤消息的具體內容。 – 2013-02-09 20:19:07

+0

我真的不熟悉SSCCE。你的意思是你要我展示一些東西:Complex c; cout <<「輸入一個複數\ n」; cin >> c; – 2013-02-09 20:24:58

+1

你知道C++標準庫已經有[複數](http://en.cppreference.com/w/cpp/numeric/complex)嗎? – 2013-02-09 20:25:28

回答

4

該錯誤是在這條線:

cout << "real: " <<is>> r; 

這被解釋爲

((cout << "real: ") << is) >> r 

這裏的問題是,如果您從輸出切換到cout並從is開始讀取,則不能有這樣的行。一個更好的方式來做到這將是

cout << "real: "; 
is >> r; 

也就是說,這是一個非常糟糕的主意。您不應該有operator >>顯示提示,因爲這意味着如果您想從文件中讀入類型的對象,則每次您都會在屏幕上顯示提示「real」。你應該有operator >>只讀取表示,並在閱讀之前明確提示,如果這是你想要做的。

希望這會有所幫助!

+0

我只是改變了你說的幾秒鐘,然後你發佈答案哈哈。但是,謝謝:) – 2013-02-09 20:36:34

1

的錯誤是在這條線:

cout << "real: " <<is>> r; 

您的意思是使用< <,而不是>>上最後一個?由於您使用了>>,因此它試圖將「is」寫入cout,但運算符< <沒有超載,它需要basic_ostream和basic_istream。

相關問題