IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

Problème redéfinition opérateur <<


Sujet :

C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Points : 114
    Points
    114
    Par défaut Problème redéfinition opérateur <<
    Bonjour,

    Voila j'essai de compter le nombre de mot d'un texte avec une map. (histoire de pas comtper deux fois le même mot). Pourtant j'ai une erreur que je ne comprends pas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error C2679: binary '<<' : no operator found which takes a right-hand operand of type 'const std::pair<_Ty1,_Ty2>' (or there is no acceptable conversion)
    J'ai pourtant bien redéfini l'opérateur << dans ma classe . Voici mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    #include "CompteMot.h"
     
    CompteMot::CompteMot ()
    {
    }
     
    CompteMot::~CompteMot ()
    {
    }
     
    void CompteMot::comptage ()
    {
    	std::map<std::string, int, std::less<std::string> > dico;
    	std::string mot;
    	std::ostream_iterator<std::pair<const std::string, int> > outDate (std::cout, " ");
     
    	std::copy (dico.begin (), dico.end (), outDate);
    	while (std::cin >> mot)
    	{
    		if (dico.find (mot) != dico.end ())
    		{
    			++(*(dico.find (mot))).second;
    		}
    		else
    		{
    			dico[mot] = 1;
    		}
    	}
    	std::copy (dico.begin (), dico.end (), outDate);
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    #ifndef COMPTEMOT_H
    #define COMPTEMOT_H
     
    #include <map>
    #include <iterator>
    #include <iostream>
    #include <string>
     
    class CompteMot
    {
    	public:
    		CompteMot ();
    		virtual ~CompteMot ();
    		virtual void comptage ();
    };
     
    inline std::ostream& operator<<(std::ostream& os, const std::pair<const std::string, int>& p)
    {
    	os << p.first << " " << p.second << std::endl;
     
    	return os;
    }
     
    #endif
    Si quelqu'un vois ce qu'il ne va pas merci d'avance

  2. #2
    Membre éclairé

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Points : 858
    Points
    858
    Par défaut
    Pour je ne sais quelle obscure raison, dans un tel cas l'opérateur << est recherché dans le namespace std. Il faut donc l'y mettre pour que cela compile.

    A noter sinon que tu peux simplifier ta boucle par ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    while (std::cin >> mot)
        ++dico[mot];
    c'est tout à fait équivalent, plus simple et plus rapide !

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Points : 114
    Points
    114
    Par défaut
    En effet il cherchait bien dans le namespace std... J'avoue ne jamais avoir vue une telle chose

    Sinon pour la notation c'était pour m'amusé^^ mais c'est vrai que c'est plus simple et SURTOUT plus compréhensible comme tu l'as proposé

    Sinon maintenant ça marche bien je te remercie

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par Sylvain Togni Voir le message
    Pour je ne sais quelle obscure raison
    Son petit nom : Argument dependent name lookup. Pour faire pro : Koenig lookup. Un peu de lecture ici.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème redéfinition de l'opérateur []
    Par scary dans le forum Débuter
    Réponses: 2
    Dernier message: 05/03/2010, 11h00
  2. Redéfinition opérateurs new et delete globaux
    Par bolhrak dans le forum C++
    Réponses: 8
    Dernier message: 30/07/2007, 11h34
  3. [Tableaux] Problème d'opérateurs de bits
    Par tonypeter dans le forum Langage
    Réponses: 2
    Dernier message: 04/03/2007, 16h09
  4. [MySQL] Problème avec opérateur de condition
    Par Dhumkazaar dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 02/03/2007, 18h41
  5. Problème d'opérateur
    Par iomega dans le forum Langage
    Réponses: 18
    Dernier message: 17/11/2005, 11h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo