我尝试编译此代码片段,但我遇到编译器错误:(!使用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
发生什么事了?矢量构造正确,我怎么能不能称它?
致以最诚挚的问候,
答案 0 :(得分:6)
我想这个
vector<string> v( istream_iterator<string>( in ), istream_iterator<string>() );
被解析为函数声明:
vector<string> v( istream_iterator<string> in, istream_iterator<string> );
这通常称为"C++' most-vexing parse"。
我认为一些额外的括号可以解决这个问题:
vector<string> v( (istream_iterator<string>(in)), (istream_iterator<string>()) );
答案 1 :(得分:1)
这是所谓的most vexing parse的一个例子。它;是一个惹恼许多C ++程序员的问题。
基本上,此代码并不代表您认为的含义:
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>() );
答案 2 :(得分:0)
解析器认为以下行声明了一个函数:
vector<string> v( istream_iterator<string>( in ), istream_iterator<string>() );
将您的主要内容更改为此内容并进行编译:
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"));
}