2009-11-05 8 views
1

Lorsque vous essayez de compiler les éléments suivants:C++ erreur de compilation en utilisant la chaîne et istream_iterator

#include <string> 
#include <iterator> 
#include <iostream> 
using namespace std; 
int main() { 
    string s(istream_iterator<char>(cin), istream_iterator<char>()); 
    return s.size(); 
} 

g ++ 4.4.1 me donne:

main.cc: In function ‘int main()’: 
main.cc:6: error: request for member ‘size’ in ‘s’, which is of non-class type ‘std::string(std::istream_iterator<char, char, std::char_traits<char>, int>, std::istream_iterator<char, char, std::char_traits<char>, int> (*)())’ 

Selon libstdc++ docs, la chaîne a une cteur qui prend commencer/fin de la paire d'itérateurs. Pourquoi ai-je cette erreur, alors?

Répondre

5

Vous déclarez accidentellement une fonction au lieu d'instancier une chaîne. Essayez de déclarer des variables pour vos objets istream_iterator, puis de les transmettre au constructeur std :: string.

Et voici une bonne lecture qui décrit exactement votre problème: http://www.gotw.ca/gotw/075.htm

+1

Ou: string s = chaîne (istream_iterator (cin), istream_iterator ()); –

+0

Je préfère aussi l'approche de Nate Kohl, ce n'est pas très coûteux (en terme de frappe) et la copie est probablement optimisée de toute façon. –

+0

@ Mattieu M., si vous regardez la déclaration de Herb Sutter, je pense que c'est en fait moins de frappe puisque vous n'avez pas besoin de répéter le passe-partout "istream_iterator ". Ces variables sont probablement aussi optimisées, et Herb préfère "parce que c'est beaucoup plus facile à obtenir, c'est compréhensible même pour les compilateurs les plus faibles, et cela rend le code plus clair à lire pour démarrer". –

3

Rechercher « le plus contrariant parse », et vous trouverez plus que vous voulez savoir.

La ligne de fond est que le compilateur interprète vos deux paramètres en spécifiant des types au lieu de valeurs. Cela, à son tour, l'amène à interpréter votre définition comme étant une déclaration d'une fonction à la place.

3

Vous avez déclaré une fonction au lieu d'une variable. ÉCRIRE pour fixer:

string s(istream_iterator<char>(cin), (istream_iterator<char>()));