2


我尝试编译此代码片段,但出现编译器错误:(!使用 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

发生了什么?向量构造正确,我怎么不能调用它?

最好的祝福,

4

3 回答 3

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>()) );
于 2010-12-22T17:26:37.163 回答
1

这是所谓的最令人头疼的 parse的一个例子。它是一个让许多 C++ 程序员痛心的问题。

基本上,这段代码并不意味着你认为它意味着什么:

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

vector<string>您实际上是在声明一个名为return 的函数v,而不是声明一个 type 变量vector<string>

要解决此问题,请operator=像这样使用:

vector<string> v = vector<string>( istream_iterator<string>( in ), istream_iterator<string>() );
于 2010-12-22T17:29:59.437 回答
0

解析器认为以下行声明了一个函数:

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"));
}
于 2010-12-22T17:31:36.177 回答