Ошибка компиляции С++ с использованием строки и istream_iterator

При попытке скомпилировать следующее:

#include <string>
#include <iterator>
#include <iostream>
using namespace std;
int main() {
  string s(istream_iterator<char>(cin), istream_iterator<char>());
  return s.size();
}

g++ 4.4.1 дает мне:

main.cc: In function ‘int main()’:
main.cc:6: error: request for member ‘size’ in ‘s’, which is of non-class type ‘std::string(std::istream_iterator<char, char, std::char_traits<char>, int>, std::istream_iterator<char, char, std::char_traits<char>, int> (*)())’

Согласно документам libstdc++, строка имеет ctor, который принимает пара итераторов начала/конца. Почему тогда я получаю эту ошибку?


person Yang    schedule 05.11.2009    source источник


Ответы (3)


Вы случайно объявляете функцию вместо создания экземпляра строки. Попробуйте объявить переменные для ваших объектов istream_iterator, а затем передать их конструктору std::string.

И вот хорошее чтение, которое точно описывает вашу проблему: http://www.gotw.ca/gotw/075.htm

person Fred Larson    schedule 05.11.2009
comment
Или: string s = string(istream_iterator‹char›(cin), istream_iterator‹char›()); - person Nate Kohl; 06.11.2009
comment
Я также предпочитаю подход Нейта Коля, он не очень затратный (с точки зрения набора текста), и копия, вероятно, в любом случае оптимизирована. - person Matthieu M.; 06.11.2009
comment
@ Mattieu M., если вы посмотрите на декларацию Херба Саттера, я думаю, что на самом деле набирать текст меньше, поскольку вам не нужно повторять шаблон istream_iterator‹char›. Эти переменные, вероятно, тоже оптимизированы, и Херб предпочитает это, потому что это намного проще сделать правильно, это совершенно понятно даже для самых слабых компиляторов, и это делает код более ясным для чтения. - person Fred Larson; 06.11.2009

Поищите «самый неприятный анализ», и вы найдете больше, чем хотите знать.

Суть в том, что компилятор интерпретирует ваши два параметра как определяющие типы, а не значения. Это, в свою очередь, приводит к тому, что он интерпретирует ваше определение как объявление функции.

person Jerry Coffin    schedule 05.11.2009

Вы объявили функцию вместо переменной. Напишите следующее, чтобы исправить:

string s(istream_iterator<char>(cin), (istream_iterator<char>()));
person Kirill V. Lyadvinsky    schedule 05.11.2009