2014-06-07 49 views
6

我想用它的範圍構造函數,然後輸出他們通過cout加載從一個文本文件中的所有行成vector<string如何正確使用矢量範圍構造函數?

#include<iostream> 
#include<fstream> 
#include<vector> 
#include<iterator> 

using namespace std; 

int main() 
{ 
    ifstream file("file.txt"); 
    vector<string> strings(istream_iterator<string>(file) , istream_iterator<string>()); 

    for(auto s : strings) 
    cout << s << endl; 

    return 0; 
} 

當試圖編譯上面的代碼,我得到幾個錯誤,例如:

error: no matching function for call to ‘begin(std::vector<std::basic_string<char> > (&) (std::istream_iterator<std::basic_string<char> >, std::istream_iterator<std::basic_string<char> > (*) ()))’ 
    for(auto s : strings) 
       ^

和其他幾個人......

我想我缺少明顯的東西在這裏,任何人都可以請幫助?

+3

請參閱[Most Vexing Parse](http://en.wikipedia.org/wiki/Most_vexing_parse)。 – chris

+3

這可能有所幫助:http://stackoverflow.com/questions/7007817/a-confusing-detail-about-the-most-vexing-parse – templatetypedef

+0

明白了。我應該刪除這個問題還是自己回答? – JLagana

回答

6

你犧牲品最棘手的解析,在編譯器看到你的聲明爲返回vector<string>功能strings,取兩個參數:

  • istream_iterator<string>稱爲file
  • 一個不願透露姓名的函數指針不帶任何參數並返回istream_iterator<string>

爲了消除令人煩惱的解析,使用額外的對括號周圍的第一個參數:

vector<string> strings((istream_iterator<string>(file)) , istream_iterator<string>()); 
//     ^       ^

,或者可選地在C++ 11,使用花括號用於strings構造

vector<string> strings{istream_iterator<string>(file) , istream_iterator<string>()}; 
//     ^              ^

備註:Clang通過-Wvexing-parse(默認情況下爲此通知您)。