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:
file
appelé istream_iterator
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).