2010-04-16 105 views
3

我有以下C++代碼:奇妙C++編譯器的問題

typedef istream_iterator<string> isi; 

// (1) 
vector<string> lineas(isi(cin), isi()); 

// (2) 
//vector<string> lineas; 
//copy(isi(cin), isi(), back_inserter(lineas)); 

typedef vector<string>::iterator vci; 
for (vci it = lineas.begin(); it != lineas.end(); ++it) 
    cout << *it << endl; 

然而,我得到的錯誤在編譯:

test.cpp: In function 'int main(int, char**)': 
test.cpp:16: error: request for member 'begin' in 'lineas', which is of non-class type 'std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >(main(int, char**)::isi, main(int, char**)::isi (*)())' 
test.cpp:16: error: request for member 'end' in 'lineas', which is of non-class type 'std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >(main(int, char**)::isi, main(int, char**)::isi (*)())' 

但是,如果我代替(1)(2),它編譯。

我正在使用g ++ 4.4.0

怎麼了?

+1

不要嘗試使用HTML標籤格式化您的代碼 - 使用文本輸入區域上方的1010按鈕。 – 2010-04-16 10:49:59

+0

好的,下次我會這樣做 – yassin 2010-04-16 10:56:41

回答

12

編譯器和你不同的解讀這條線:

vector<string> lineas(isi(cin), isi()); 

對你來說是定義和初始化vector<string>類型的變量lineas與接受兩個迭代器的構造。

對於編譯器要定義一個函數lineas返回vector<string>並採取兩個參數其中第一個是isi和第二部分是一個功能不接受參數並且返回一個isi ......隨着時間的推移,你會得到用於讀取編譯器錯誤以及它從代碼中讀取的內容。

最簡單的辦法是增加一對額外的括號:

vector<string> lineas((isi(cin)), isi()); 

你可以找到在C++ FAQ精簡版here更詳細的解釋。

+0

是的,就是這樣。非常感謝! – yassin 2010-04-16 11:00:11

+2

「第一個是一個函數本身......」< - 你的意思是「其中的第二個」:)第一個是採用「isi」。 – 2010-04-17 10:56:50

+0

正確...更正。我傾向於懶讀閱讀錯誤信息。一旦我知道問題和解決方案是什麼,我傾向於關閉神經元:) – 2010-04-17 11:23:12

1

第一行根據C++的規則,指出「一切什麼是可能會被解析爲一個申報將作爲聲明中過去了」,所以在你的例子你聲明FNC名爲lineas這需要第一個參數::
ISI( cin),
isi類型稱爲cin和第二個參數:
isi() 指向不帶任何參數並返回isi類型對象的函數的指針。作爲結果,你的函數返回字符串的向量;