2013-02-26 34 views
-1

我正在嘗試創建一個類,該類與有理數一起工作並在其上執行運算符重載。我在程序的一部分,輸入流上有問題。從'int'類型的表達式中獲取'std :: istream&'類型的引用的無效初始化

例如,我應該以格式「12/8」的輸入,它應該將12存入變量a,然後8存入變量b。

這裏是我的代碼:

istream& operator>>(istream& In, Rational& Item) 
{ 
    char division_sign; 
    int a,b; 

    In >> a >> division_sign; 
    if (division_sign != '/' || !In.good()) 
    { 
     In.setstate(ios::failbit); 
    } 
    else 
    { 
     In >> b; 
     if (b != 0 || !In.good()) 
     { 
     return Item.numerator_ = a, Item.denominator_ = b; 
     } 
    } 
} 

,這裏是錯誤我收到:

In function 'std::istream& operator>>(std::istream&, Rational&)': 
131: error: invalid initialization of reference of type 'std::istream&' from expression of type 'int' 

Line 131return聲明

+0

相關:http://stackoverflow.com/questions/9825768/safer -but-easy-to-use-and-flexible-c-alternative-to-sscanf/9832875#9832875 – 2013-02-26 18:39:33

回答

5

你觀察到的編譯錯誤是由於這樣的事實您嘗試返回另一個類型的值,就像您放入聲明中一樣。你需要返回In而不是b

return In; 

因此,應該在函數執行路徑的任何可能的分支返回istream對象引用。也就是說,只將一個這樣的return語句放到函數的末尾。

另請參閱this FAQ關於運算符重載。

+0

所以現在我得到這個錯誤:警告:控制到達非空函數結束 – Goose 2013-02-26 18:41:34

+1

@Goose:那麼你應該有看看我的第二段。如果你聲明瞭一個返回某種類型的函數,你必須確保你總是可以返回某種類型的東西。 – moooeeeep 2013-02-26 18:43:59

+0

我重讀了你的段落並思考了一段時間,然後「就是說,在函數結尾處只放一個這樣的返回語句。」讀完之後,我想出了回報聲明應該在哪裏。謝謝。不知道爲什麼人們低估了這個問題.. – Goose 2013-02-26 18:54:08

3

你的代碼有幾個錯誤。首先,你 必須返回In,並且只有In作爲你在 函數中做的最後一件事; return In;應該是 函數中的最後一行,並且在函數中應該有其他返回。 其次,您訪問division_sign未驗證 輸入成功(如果 輸入已失敗,則不應設置failbit)。

粗略地講,像下面應該做的 招:

char separator; 
int nominator; 
int divisor; 
in >> nominator >> separator >> divisor; 
if (in && separator != '/') { 
    in.setstate(std::ios_base::failbit); 
} 
if (in) { 
    item = Rational(nominator, divisor); 
} 
return in; 

你可能想讀 頻前檢查分離器,這樣你就不會提取任何更多的字符,如果是 錯誤。 (在另一方面,你已經提取了完整的 int,所以它要爲客戶很難 繼續反正。)

相關問題