2013-02-13 3 views
0

я хочу сделать следующее:Как использовать зЬй :: 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’ 

Что мне нужно сделать, чтобы сделать эту работу?

[править]
Just пояснения: operator>> дает отформатирован выхода - он теряет пробельные символы (табуляция, новые строки и т.д.). Чтобы получить доступ ко всем символам, вам необходимо использовать get().

+8

Операции ввода изменяют поток. Вы не можете сделать это 'const'. – chris

+0

@chris: okay - это исправлено - поставьте свой комментарий в качестве ответа, чтобы я мог его принять, thx (сообщение об ошибке не полезно в этом случае :() – slashmais

ответ

3

С is >> ch; извлекает символы от is, он изменяет поток. Поэтому в сигнатуре функции это не может быть const, что может привести к кажущимся нерелевантным ошибкам, потому что нет точного соответствия. Измените функцию, чтобы взять std::istream &.

+0

Я полагаю, это потому, что потоку необходимо увеличить какой- next'-pointer – slashmais

+1

Ну, когда вы думаете об этом, с 'cin >> i', входной буфер начинается с, скажем,' 576 \ n' и содержит '\ n' после. Он должен изменить его в порядке – chris

+0

@chris Технически входной буфер находится в streambuf, а не в самом потоке. Это косвенное действие может позволить большую часть операций в const 'istream' (исключение составляет установку ошибок, таких как конец файла). Однако, поток данных является «логически» частью 'istream', поэтому логический const говорит, что все, что его модифицирует или ваша позиция в нем, не должно быть const. –

Смежные вопросы