我有以下C++代码:
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;
Run Code Online (Sandbox Code Playgroud)
但是,我在编译时遇到错误:
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 (*)())'
Run Code Online (Sandbox Code Playgroud)
但是,如果我用(2)替换(1),它就会编译.
我正在使用g ++ 4.4.0
怎么了?
Dav*_*eas 12
编译器和您正在以不同方式解释此行:
vector<string> lineas( isi(cin), isi() );
Run Code Online (Sandbox Code Playgroud)
对于您来说,它是使用带有两个迭代器的构造函数定义和初始化lineas类型的变量vector<string>.
对于编译器,你定义一个函数lineas返回一个vector<string>并取两个参数,第一个是一个isi,第二个是一个不带参数的函数并返回一个isi......随着时间的推移,你将习惯于阅读编译器错误及其内容正在阅读您的代码.
最简单的解决方案是添加一对额外的括号:
vector<string> lineas( (isi(cin)), isi() );
Run Code Online (Sandbox Code Playgroud)
你可以找到在C++ FAQ精简版更详细的解释在这里.