2


このコードスニペットをコンパイルしようとしましたが、コンパイラエラーが発生しました:(!VisualStudio2010でコンパイルします

#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++ の最も厄介な解析」と呼ばれます。

いくつかの余分な括弧がこれを解決すると思います:

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>() );

type の変数を宣言する代わりに、vector<string>実際にはを返すという名前の関数を宣言しています。vvector<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>() );

メインをこれに変更すると、コンパイルされます:

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 に答える