2010-04-16 6 views
3

je le code C++ suivant:Bizarre C++ problème compilateur

typedef istream_iterator<string> isi; 

// (1) 
vector<string> lineas(isi(cin), isi()); 

// (2) 
//vector<string> lineas; 
//copy(isi(cin), isi(), back_inserter(lineas)); 

typedef vector<string>::iterator vci; 
for (vci it = lineas.begin(); it != lineas.end(); ++it) 
    cout << *it << endl; 

Cependant, je reçois l'erreur lors de la compilation:

test.cpp: In function 'int main(int, char**)': 
test.cpp:16: error: request for member 'begin' in 'lineas', which is of non-class type 'std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >(main(int, char**)::isi, main(int, char**)::isi (*)())' 
test.cpp:16: error: request for member 'end' in 'lineas', which is of non-class type 'std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >(main(int, char**)::isi, main(int, char**)::isi (*)())' 

Cependant, si je remplace (1) par (2), il compile.

J'utilise g ++ 4.4.0

Qu'est-ce qui ne va pas?

+1

N'essayez pas de formater votre code en utilisant des balises HTML - utilisez le bouton 1010 au-dessus de la zone d'entrée de texte. –

+0

Ok, je le ferai la prochaine fois – yassin

Répondre

12

Le compilateur et vous interprétez cette ligne différemment:

vector<string> lineas(isi(cin), isi()); 

Pour vous, il définit et initialiser une lineas variable de type vector<string> avec le constructeur qui prend deux itérateurs.

Pour le compilateur vous définissez une fonction lineas retournant un vector<string> et en prenant deux arguments dont le premier est un isi et dont la seconde est une fonction sans argument et le retour d'un isi ... Avec le temps, vous obtiendrez utilisé pour lire les erreurs du compilateur et ce qu'il lit à partir de votre code.

La solution la plus simple d'ajouter une paire de parenthèses:

vector<string> lineas((isi(cin)), isi()); 

Vous pouvez trouver une explication plus dans le C++ FAQ Lite here.

+0

Oui, c'est ça. Merci beaucoup! – yassin

+2

"le premier dont est une fonction elle-même ..." <- vous vouliez dire "le second dont" :) Le premier est de prendre un "isi". –

+0

Droite ... corrigée. J'ai tendance à être paresseux en lisant des messages d'erreur. Une fois que je sais quel est le problème et la solution, j'ai tendance à éteindre les neurones :) –

1

Première ligne selon les règles de C indiquant que « tout ce qui est possible sera analysé comme une déclaration sera adoptée comme une déclaration » si dans votre exemple, vous déclarez un Lineas de fnc nommé qui prend le premier argument ::
isi (cin),
de type isi appelé cin et second argument:
isi() pointeur sur la fonction ne prenant aucun argument et renvoyant l'objet de type isi. Votre fonction renvoie le vecteur de chaînes en conséquence;