Comment utiliser correctement un constructeur de plage de vecteurs?

Je veux charger toutes les lignes d’un fichier texte dans une vector<string en utilisant son constructeur d’intervalle, puis les afficher via cout :

 #include #include #include #include using namespace std; int main() { ifstream file("file.txt"); vector ssortingngs(istream_iterator(file) , istream_iterator()); for(auto s : ssortingngs) cout << s << endl; return 0; } 

Lorsque j’essaie de comstackr le code ci-dessus, plusieurs erreurs se produisent, par exemple:

 error: no matching function for call to 'begin(std::vector<std::basic_string > (&) (std::istream_iterator<std::basic_string >, std::istream_iterator<std::basic_string > (*) ()))' for(auto s : ssortingngs) ^ 

et plusieurs autres …

Je pense qu’il me manque quelque chose d’évident ici, quelqu’un peut-il aider s’il vous plaît?

Vous êtes victime de Most Vexing Parse, dans lequel le compilateur voit votre déclaration comme une vector fonction renvoyant un vector , en prenant deux arguments:

  • un file appelé istream_iterator
  • un pointeur non nommé sur une fonction qui ne prend aucun argument et renvoie un istream_iterator .

Pour éliminer l’parsing vexante, utilisez une paire de parenthèses supplémentaire autour du premier argument:

 vector ssortingngs((istream_iterator(file)) , istream_iterator()); // ^ ^ 

ou, alternativement, en C ++ 11, utilisez des accolades pour le constructeur de ssortingngs

 vector ssortingngs{istream_iterator(file) , istream_iterator()}; // ^ ^ 

REMARQUE : Clang vous en avertit par l’intermédiaire de -Wvexing-parse ( -Wvexing-parse par défaut).