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

Langage C++ Discussion :

Surcharge d'opérateur == sur une pair


Sujet :

Langage C++

  1. #1
    Membre régulier
    Homme Profil pro
    Second de cuisine
    Inscrit en
    Avril 2005
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Second de cuisine
    Secteur : Alimentation

    Informations forums :
    Inscription : Avril 2005
    Messages : 193
    Points : 99
    Points
    99
    Par défaut Surcharge d'opérateur == sur une pair
    Bonjour !

    Voici le début du problème, j'ai une multimap<long, Event>, et je cherche a supprime une entrée grace a une fonction en passant comme argument une reference de Event

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void EventFactory::DeleteEvent(const Event& ev)
    {
        for(auto itr = _events.begin(); itr != _events.end(); ++itr)
        {
            if(itr->second == ev) 
            {
                _events.erase(itr);
            }
        }
    }
    Erreur sur la comparaison:
    D:\C++\projects\Servers\Shared\EventFactory.cpp|19|error: no match for 'operator==' in 'itr.std::_Rb_tree_iterator<_Tp>::operator-> [with _Tp = std::pair<const long int, Event>]()->std::pair<const long int, Event>::second == ev'|

    Evidemment, je n'ai jamais fait ca
    Donc je tente:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    bool pair<long, Event>::operator==(const pair<long, Event> &comp) const {
    {
        return ((this.second.Repeat() == comp.second.Repeat())
                && (this.second.Delay() == comp.second.Delay())
                && (this.second.Repeated() == comp.second.Repeated())
                && (this.first == comp.first));
    }
    Evidemment:

    D:\C++\projects\Servers\Master\..\Shared\Event.h|36|error: too few template-parameter-lists|
    Comment faire pour que cela marche?

    merci!

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 123
    Points : 33 023
    Points
    33 023
    Billets dans le blog
    4
    Par défaut
    Bonjour,
    essaye ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    template<>
    bool pair<long, Event>::operator==(const pair<long, Event> &comp) const {
    {
        return ((this.second.Repeat() == comp.second.Repeat())
                && (this.second.Delay() == comp.second.Delay())
                && (this.second.Repeated() == comp.second.Repeated())
                && (this.first == comp.first));
    }
    Edit: ha ben non je suis mauvais au réveil avant mon jus d'orange. (pourtant operator==(const, const) externe à la classe j'y ai pensé )
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 620
    Points
    15 620
    Par défaut
    Perdu

    Citation Envoyé par DakM Voir le message
    D:\C++\projects\Servers\Shared\EventFactory.cpp|19|error: no match for 'operator==' in 'itr.std::_Rb_tree_iterator<_Tp>::operator-> [with _Tp = std::pair<const long int, Event>]()->std::pair<const long int, Event>::second == ev'|
    L'erreur de vient pas de std::pair<const long int, Event>, mais de std::pair<const long int, Event>::second, c'est à dire de Event.

    Par contre, tu ne peux pas te contenter de fournir une définition pour une fonction membre : il faut que la classe déclare cette fonction. Et si c'était le cas (déclaration de la fonction sans sa définition), tu aurais un autre type d'erreur (link erreur, fonction non trouvée, en gros).

    Il faut simplement ajouter l'opérateur == pour Event, mais en fonction libre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    bool operator== (const Event& e1, const Event& e2) {
        return ((e1.Repeat() == e2Repeat())
                && (e1.Delay() == e2.Delay())
                && (e1.Repeated() == e2.Repeated())
                && (e1 == e2.first));
    }
    PS: D'où viennent ces events ? Tu utilises un framework particulier ? Si c'est le cas, c'est probablement normal que == n'existe pas. Si c'est toi qui a créé ce système d'events, c'est probablement une erreur
    A priori, cette classe Event doit respecter la sémantique d'entité et donc ne pas définir d'opérateur == (ni d'opérateur = donc tu ne peux pas les mettre dans une map). Tu dois passer par des pointeurs (de préférence shared_ptr) et tester simplement que les pointeurs correspondent au même objet en mémoire
    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
    map<long, shared_ptr<Event>> _events;
     
    void EventFactory::DeleteEvent(Event* ev)
    {
        if (!ev) 
            return;
     
        for(auto itr = _events.begin(); itr != _events.end(); ++itr)
        {
            if(itr->second == ev) 
            {
                _events.erase(itr);
            }
        }
    }
    PS2 : pour rappel, this est un pointeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    this->second.Repeat()
    this->second.Delay()
    this->second.Repeated()
    this->first

Discussions similaires

  1. Réponses: 3
    Dernier message: 02/03/2010, 08h16
  2. Réponses: 4
    Dernier message: 13/11/2009, 15h48
  3. Surcharge d'opérateur dans une classe template
    Par Opérateur dans le forum Langage
    Réponses: 6
    Dernier message: 22/12/2008, 03h26
  4. Réponses: 2
    Dernier message: 11/01/2008, 10h40
  5. Réponses: 3
    Dernier message: 08/01/2008, 16h53

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