Невозможно получить доступ к вектору при построении с диапазоном istream_iterator - PullRequest
2 голосов
/ 22 декабря 2010


Я пытался скомпилировать этот фрагмент кода, но получил ошибку компилятора :(! Компилировать с Visual Studio 2010

#include <vector>
#include <string>
#include <sstream>
#include <iterator>
#include <iostream>

using namespace std;

int main() {
    string s( "Well well on" );
    istringstream in( s );
    vector<string> v( istream_iterator<string>( in ), istream_iterator<string>() );
    copy( v.begin(), v.end(), ostream_iterator<string>( cout, "\n" ) );
}

Ошибки:

Error   1   error C2228: left of '.begin' must have class/struct/union  c:\visual studio 2008 projects\vector test\vector test\main.cpp 13  vector test
Error   2   error C2228: left of '.end' must have class/struct/union    c:\visual studio 2008 projects\vector test\vector test\main.cpp 13  vector test

Что случилось?был построен правильно, как я не мог быть в состоянии назвать это?

С уважением,

Ответы [ 3 ]

6 голосов
/ 22 декабря 2010

Я думаю, что это

vector<string> v( istream_iterator<string>( in ), istream_iterator<string>() );

анализируется как объявление функции:

vector<string> v( istream_iterator<string> in, istream_iterator<string> );

Это обычно называется "C ++ 'самый неприятный анализ" .

Я думаю, что несколько дополнительных скобок вылечат это:

vector<string> v( (istream_iterator<string>(in)), (istream_iterator<string>()) );
1 голос
/ 22 декабря 2010

Это пример так называемого самого неприятного анализа . Это хит, который ужалит многих программистов на С ++.

По сути, этот код не означает, что вы думаете, что он означает:

vector<string> v( istream_iterator<string>( in ), istream_iterator<string>() );

Вместо объявления переменной типа vector<string> вы фактически объявляете функцию с именем v, которая возвращает vector<string>.

Чтобы исправить это, используйте operator=, например:

vector<string> v = vector<string>( istream_iterator<string>( in ), istream_iterator<string>() );
0 голосов
/ 22 декабря 2010

Синтаксический анализатор считает, что следующая строка объявляет функцию:

vector<string> v( istream_iterator<string>( in ), istream_iterator<string>() );

Измените ваш main на это, и он скомпилирует:

int main() 
{
    string s( "Well well on" );
    istringstream in( s );
    istream_iterator<string> start = istream_iterator<string>(in);
    vector<string> v(start, istream_iterator<string>());
    copy(v.begin(), v.end(), ostream_iterator<string>(cout, "\n"));
}
...