funciona este código:función vs declaración de variables en C++
std::ifstream f(mapFilename.c_str());
std::string s = std::string(std::istreambuf_iterator<char>(f), std::istreambuf_iterator<char>());
ParseGameState(s);
medio de las cuales es una mapFilename
std::string
y void ParseGameState(const std::string&);
.
Y esto no es así:
std::ifstream f(mapFilename.c_str());
std::string s(std::istreambuf_iterator<char>(f), std::istreambuf_iterator<char>());
ParseGameState(s);
Este es el error:
game.cpp: In member function ‘int Game::LoadMapFromFile(const std::string&)’:
game.cpp:423: error: no matching function for call to ‘ParseGameState(std::string (&)(std::istreambuf_iterator<char, std::char_traits<char> >, std::istreambuf_iterator<char, std::char_traits<char> > (*)()))’
game.cpp:363: note: candidates are: ParseGameState(const std::string&)
por lo que parece que reconoce s
como una declaración de la función y no una declaración de variables en este caso.
¿Por qué es eso? ¿Es esto un error en GCC 4.2.1 (compilación de Apple)? ¿O GCC maneja esto correctamente? ¿Está esto indefinido en el estándar de C++?
Gracias! [Aquí en WP] (http://en.wikipedia.org/wiki/Most_vexing_parse) también es una buena explicación sobre el análisis más irritante. – Albert
Parece que la declaración de la variable 'std :: string' anterior no funcionará en C++ 0x: Debido a que' std :: string' tiene un constructor de listas de inicialización, todo el '{...} 'se tomará como un único argumento, e intentará inicializar el parámetro' initializer_list 'y no se compilará :( –
@Johannes: Sí, creo que tienes razón. Casi me pregunto si no sería mejor si esto fue reformulado entonces, en lugar de considerar un inicializador de lista y luego (solo si no estaba presente) considerar otros ctors, sino crear un conjunto de sobrecarga y seleccionar la mejor coincidencia, probablemente con el ajuste menor que al crear un initializer_list sería equivalente a ninguna conversión con respecto a la bondad de coincidencia (con la condición de que solo he pensado en ello unos minutos, por lo que podría causar un problema sutil (o incluso evidente) que me falta). –