2012-03-11 89 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; 
} 

爲什麼該行出錯? 我知道編譯器'v'作爲一個函數!令人驚歎的...vector <int> v(istream_iterator <int>(cin),istream_iterator <int>());

+6

這將是很好,如果你能告訴我們什麼是真正的錯誤是你越來越...... – Bart 2012-03-11 15:11:20

+3

什麼是問題? – jalf 2012-03-11 15:14:12

回答

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

這比「雙括號技巧」更容易理解。

0

當我嘗試編譯它,唯一的錯誤,我得到的是對未來,在那裏抱怨v.begin()v.end()是無效的,因爲v是不是一類/結構/聯合(爲明顯因爲如前所述,你遇到了最令人頭疼的解析)。

0

如果您只需添加一行,您可以避免使用MVP,而且您的代碼可以更具可讀性,而且不會重複。

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

這裏有用作函數參數的函數指針聲明:

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

所以,看你的問題:

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

是的,是的,我們知道istream_iterator<int>(cin)istream_iterator<int>類型參數。 但是,第二個參數是我們遇到的問題:istream_iterator<int>()可以理解爲指向返回istream_iterator<int>且沒有參數的函數的指針。這使編譯器感到困惑,v可能是函數聲明或動詞定義。如果第二個參數不是函數指針,v是一個動詞定義。

我們可以通過兩種方式解決您的問題,第一,你可以聲明迭代器,然後在v使用它們:

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

解決它的第二種方法是:

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

我們圍繞第一個元素添加(),它告訴編譯器它是一個動詞,而不是一個參數,所以第二個元素也必須是一個動詞。就這樣。

相關問題