Bizarre C ++ Compiler Problem

I have the following C ++ code:

typedef istream_iterator<string> isi;

// (1)
vector<string> lineas(isi(cin), isi());

// (2)
//vector<string> lineas;
//copy(isi(cin), isi(), back_inserter(lineas));

typedef vector<string>::iterator vci;
for (vci it = lineas.begin(); it != lineas.end(); ++it)
    cout << *it << endl;

However, when compiling, I get an error:

test.cpp: In function 'int main(int, char**)':
test.cpp:16: error: request for member 'begin' in 'lineas', which is of non-class type 'std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >(main(int, char**)::isi, main(int, char**)::isi (*)())'
test.cpp:16: error: request for member 'end' in 'lineas', which is of non-class type 'std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >(main(int, char**)::isi, main(int, char**)::isi (*)())'

However, if I replace (1) with (2), it compiles.

I am using g ++ 4.4.0

What's wrong?

+3
source share
2 answers

The compiler, and you interpret this line differently:

vector<string> lineas( isi(cin), isi() );

For you, this is the definition and initialization of a lineastype variable vector<string>using a constructor that takes two iterators.

lineas, vector<string> , isi, , isi. .

:

vector<string> lineas( (isi(cin)), isi() );

++ FAQ Lite .

+12

++, , ", , ", fnc lineas, ::
ISI (CIN),
isi cin :
ISI() , isi. ;

+1

Source: https://habr.com/ru/post/1741427/


All Articles