2014-06-07 8 views
6

Ich möchte alle Zeilen aus einer Textdatei in ein vector<string laden durch ihr Angebot Konstruktor und dann gibt sie durch cout:Wie wird ein Vector Range Constructor richtig verwendet?

#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; 
} 

Beim Versuch, den obigen Code ich mehrere Fehler zu kompilieren, zum Beispiel:

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

und einige andere ...

ich glaube, ich bin etwas offensichtlich hier fehlt, kann jemand bitte helfen?

+3

Siehe [Most Vexing Parse] (http://en.wikipedia.org/wiki/Most_vexing_parse). – chris

+3

Dies könnte helfen: http://stackoverflow.com/questions/7007817/a-confusing-detail-about-the-most-vexing-parse – templatetypedef

+0

Got it. Soll ich diese Frage löschen oder selbst beantworten? – JLagana

Antwort

6

Sie haben ein Opfer der drängendsten Parse gefallen, wo der Compiler Ihre Erklärung als Funktion sieht strings eine vector<string> Rückkehr unter zwei Argumente:

  • ein istream_iterator<string>file
  • ein ungenannter Zeiger genannt zu funktionieren keine Argumente nehmen und eine istream_iterator<string> zurückgeben.

Um das vexing parst, verwenden, um ein zusätzliches Paar von Klammern um das erste Argument zu beseitigen:

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

oder alternativ in C++ 11, geschweiften Klammern für den Konstruktor strings

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

HINWEIS: Clang warnt Sie durch -Wvexing-parse (standardmäßig aktiviert).