奇怪的C编译问题

我有以下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;

但是,我在编译时遇到错误

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::allocator<char> > > >(main(int,char**)::isi,main(int,char**)::isi (*)())'
test.cpp:16: error: request for member 'end' in 'lineas',char**)::isi (*)())'

但是,如果我用(2)替换(1),它就会编译.

我正在使用g 4.4.0

怎么了?

解决方法

编译器和您正在以不同方式解释此行:

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

为您定义并初始化vector< string>类型的变量lineas.使用带有两个迭代器的构造函数.

对于编译器,您要定义一个返回向量< string>的函数行.并且取两个参数,第一个是isiand,第二个参数是一个不带参数的函数并返回一个isi …随着时间的推移,你将习惯于阅读编译器错误以及从代码中读取的内容.

最简单的解决方案是添加一对额外的括号:

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

您可以在C FAQ Lite here中找到更长的解释.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...