Considerate questo esempio:Vector costruttore con due parametri viene analizzato come una dichiarazione di funzione
#include <iostream>
#include <string>
#include <vector>
#include <iterator>
int main()
{
std::string sen = "abc def ghi jkl";
std::istringstream iss(sen);
std::vector<std::string> // declaration in question
vec(std::istream_iterator<std::string>(iss),
std::istream_iterator<std::string>());
std::copy(vec.begin(), vec.end(),
std::ostream_iterator<std::string>(std::cout, "\n"));
}
Il compilatore genera un errore alla chiamata a std::copy
request for member 'begin' in 'vec', which is of non-class type...
posso andare in giro l'errore In questo modo:
std::istream_iterator<std::string> it_begin(iss);
std::istream_iterator<std::string> it_end;
std::vector<std::string> vec(it_begin, it_end);
o mettendo tra parentesi ciascun parametro, in questo modo:
std::vector<std::string>
vec((std::istream_iterator<std::string>(iss)),
(std::istream_iterator<std::string>()));
o anche con la nuova inizializzazione uniforme in C++ 11:
std::vector<std::string> vec { /*begin*/, /*end*/ };
Perché compilatore analizzando la dichiarazione nell'esempio come una dichiarazione di funzione? Conosco la maggior parte delle analisi irritanti, ma ho pensato che ciò avvenga solo con elenchi di parametri vuoti. Mi chiedo anche perché la seconda soluzione funziona.
GCC 4.6.1, se è importante. Ho anche provato con il compilatore online di comeau. – jrok
Salvati digitando: 'std :: istream_iterator it_begin (iss), it_end; std :: vector vec (it_begin, it_end); ' –
Domanda ben formata, ben costruita e ben formattata, on-topic e utile. Buon lavoro. :) –