возможно ли, чтобы функция getline () принимала wistream & - PullRequest
0 голосов
/ 21 августа 2009

Просто для пояснения, я имею в виду глобальную функцию getline () в строковом классе.

То, что я хочу сделать, это иметь что-то вроде этого:

int main()
{
   wifstream in(L"textfile.txt");
   someFunc(in);
   return 0;
}


void someFunc(const wistream& read)
{
   wstring buff;

   while(getline(read, buff))
   {
      //do some processing here
   }
}

но я получаю:

Error   2   error C2664: 'std::getline' : cannot convert parameter 1 from 'const std::wistream' to 'std::basic_istream<_Elem,_Traits> &'

Чтобы это исправить, мне нужно удалить const из const wistream и прочитать. Я понимаю, почему это происходит, но можно ли настроить getline () на прием wistream, без каких-либо преобразований, или я должен просто проигнорировать его и удалить const?

Ответы [ 3 ]

4 голосов
/ 21 августа 2009

Он принимает wistream, но getline () требует неконстантного аргумента, потому что он изменяет поток. Попробуйте изменить его на:

...
void someFunc(wistream& read)
...
3 голосов
/ 21 августа 2009

Чтение символов из потока изменяет поток. Вы не можете пометить поток const и ожидать, что он будет работать правильно.

0 голосов
/ 21 августа 2009

Как правило,

  1. Я всегда передаю параметры функции как const ссылки
  2. если они не являются встроенными типами, в этом случае они копируются (и const / non- const становится вопросом стиля)
  3. , если они не предназначены для изменения внутри функции, чтобы изменения отражались у вызывающей стороны, тогда они передаются не-const ссылкой
  4. , если функция не должна вызываться, даже если вызывающие не имеют объекта для передачи, тогда они передаются как указатели (# 1 и # 3 применимы и здесь)

Потоки, однако, являются заметным исключением из этого правила, поскольку они всегда должны передаваться как ссылки, не являющиеся const.

...