2013-02-13 174 views
0

我要做到以下幾點:如何使用std :: istream的正確

// I want 'is' to be either opened file or stringstream ... 
void ParseTokens(const std::istream &is, std::vector<TokenClass> &vToks) 
{ 
    char ch; 
    ... 
    is >> ch; 
    ... 
} 

編譯器會抱怨:

error: ambiguous overload for ‘operator>>’ in ‘is >> ch’ 

什麼我需要做的,使這項工作?

[編輯]
僅有一個警告:operator>>給出格式化輸出 - 它失去的空白字符(製表符,換行符等)。要訪問所有字符,您需要使用get()

+8

輸入操作修改流。你不能使它成爲'const'。 – chris 2013-02-13 08:10:54

+0

@chris:好的 - 修復它 - 把你的評論作爲答案,所以我可以接受它,thx(在這種情況下,錯誤消息是沒有幫助:() – slashmais 2013-02-13 08:12:58

回答

3

由於is >> ch;is中提取字符,它修改了流。因此,函數簽名中不能有const,這可能會導致看起來不相關的錯誤,因爲沒有完全匹配。更改功能採取std::istream &

+0

我想這是因爲流需要增加某種' next'-pointer – slashmais 2013-02-13 08:25:39

+1

好吧,當你考慮它時,用'cin >> i',輸入緩衝區以'576 \ n'開始,並在後面包含'\ n',它必須按順序修改它 – chris 2013-02-13 08:27:00

+0

@chris從技術上講,輸入緩衝區位於streambuf中,而不是流本身,這種間接方式可以允許大多數的const'istream'操作(例外是設置錯誤,比如文件尾),但是,數據流是'istream'的邏輯上的一部分,所以邏輯上的const表示任何修改它的東西或者你的位置都不應該是const。 – 2013-02-13 09:02:24

相關問題