2012-03-11 16 views
0
#include <iostream> 
#include <vector> 
#include <iterator> 
#include <algorithm> 
using namespace std; 

int main() 
{ 
    vector<int> v(istream_iterator<int>(cin), istream_iterator<int>()); //Compilation error?! 
    copy(v.begin(), v.end(), ostream_iterator<int>(cout, "\n")); 

    return 0; 
} 

なぜこの行がエラーになるのですか? 私は関数としてコンパイラthouht 'v'を知っています!素晴らしい...ベクトル<int> v(istream_iterator <int>(cin)、istream_iterator <int>());

+6

実際のエラーがあなたに届いていることを教えていただけたらうれしいです... – Bart

+3

質問は何ですか? – jalf

答えて

4

この問題はC++のmost vexing parseとして知られています。

(余分な括弧に注意)以下に最初の行を変更してみてください:

vector<int> v((istream_iterator<int>(cin)), istream_iterator<int>()); 
1

@Kyleルッツで指定されているように、それは最も厄介な解析の問題ですが、それはまた、多くの場合に初期化を変更することによって解決されます

vector<int> v=vector<int> (istream_iterator<int>(cin), istream_iterator<int>()); 

"double parenthesis trick"よりも理解しやすい傾向があります。

0

私はそれをコンパイルしようとすると、私が得る唯一のエラーは、それがvは明白ためのクラス/構造体/共用体(ではないのでv.begin()v.end()が有効でないと文句を言い行、上にありますその理由は、既に述べたように、あなたは最も厄介な解析に遭遇したということです)。

0

余分な行を1つ追加すれば、MVPを避けることができ、コードはもっと読みやすく、反復性が低くなります。

vector<int> v(istream_iterator<int>(cin), istream_iterator<int>()); 

はい、はい、私たちはistream_iterator<int>(cin)istream_iterator<int>知っている:

int f(int (*funa)()); 
int f(int funa()); 
int f(int());//The parameter name can be omitted, such as the function declaration int g(double p); is equal to int g(double); 

だから、あなたの問題を見て:

istream_iterator<int> b(cin), e; 
vector<int> v(b,e); 
0

はここで、関数のパラメータとして使用される関数ポインタの宣言がありますタイプパラメータ。 しかし、2番目のパラメータは、私たちが遭遇する問題です。istream_iterator<int>()は、istream_iterator<int>を返し、パラメータを持たない関数へのポインタとして理解できます。これは、コンパイラを混乱させます。vは、関数宣言または動詞定義です。 2番目のパラメーターが関数ポインターでない場合、vは動詞定義です。

私たちは最初に、イテレータを宣言してからvでそれらを使用することができ、二つの方法で、あなたの問題を解決することができます

istream_iterator<int> dataBegin(cin); 
istream_iterator<int> dataEnd; 
vector<int> v(dataBegin, dataEnd); 

それを修正する2番目の方法は次のとおりです。

vector<int> v((istream_iterator<int>(cin)), istream_iterator<int>()); 

たちコンパイラにパラメータではなく動詞であることを伝える最初の要素の周りに()を追加して、2番目の要素も動詞でなければなりません。それで全部です。

関連する問題