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 :

Template, events, et ambiguité


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté Avatar de Rewpparo
    Homme Profil pro
    Amateur
    Inscrit en
    Décembre 2005
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 170
    Par défaut Template, events, et ambiguité
    Bonjour,
    J'ai un petit problème avec un système d'événement. J'ai fait un bout de code comme ceci:

    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
    template <classname T> class EventListener
    {
         int getEvent(T& p_event);
    };
     
    struct inputEvent
    {
    };
     
    struct windowEvent
    {
    };
     
    class Receiver::public EventListener<inputEvent>, public EventListener<windowEvent>
    {
         void update()
         {
              inputEvent e;
              while(getEvent(e))
              {
                     //Handle event
              }
         }
    }
    A la compilation, g++ me sort :
    error: reference to ‘getEvent’ is ambiguous
    error: candidates are: unsigned int EventListener<T>::getEvent(T&) [with T = windowEvent]
    error: unsigned int EventListener<T>::getEvent(T&) [with T = inputEvent]

    Je comprend son problème, il a deux fonctions qui ont le même nom. Mais ce que je ne comprend pas, c'est que les deux fonctions ont des arguments différents, un prend une référence pour un inputEvent, l'autre pour un windowEvent, et il n'y a aucun lien d'héritage entre les deux. Je pensais que ca suffirait a lever toute ambiguïté.
    J'ai réussi a lever l'ambiguïté en mettant des EventListener<inputEvent>::getEvent(), mais mon système d'événement est destiné a être utilisé par des collègues qui ne sont pas aussi a l'aise, et j'aimerais ne pas trop alourdir la syntaxe.
    Existe t il une autre façon de lever l'ambiguïté qui soit moins lourde en syntaxe ? Est ce que c'est un bug de g++ ?

  2. #2
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    Lors de l'héritage, tu as un masquage automatique des noms dans la classe dérivée.
    Il faut les importer dans la portée courante (~ta classe) pour que la résolution par les types des paramètres se fasse.

    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
     
    // les autres classes comme avant
     
    class Receiver: public EventListener<inputEvent>, public EventListener<windowEvent>
    {
     
        using EventListener<windowEvent>::getEvent;
        using EventListener<inputEvent>::getEvent;
     
         void update()
         {
              inputEvent e;
              while(getEvent(e))
              {
                     //Handle event
              }
         }
    };
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  3. #3
    Membre expérimenté Avatar de Rewpparo
    Homme Profil pro
    Amateur
    Inscrit en
    Décembre 2005
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 170
    Par défaut
    Bon truc, ca simplifie un peu. S'il y a une solution qui n'implique pas receiver, je préfère, mais sinon je prend ca.
    Merci a toi

  4. #4
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    Citation Envoyé par Rewpparo Voir le message
    Bon truc, ca simplifie un peu. S'il y a une solution qui n'implique pas receiver, je préfère, mais sinon je prend ca.
    Merci a toi
    A part revoir l'architecture, je ne vois pas.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2009
    Messages : 110
    Par défaut
    Bonjour tout le monde.
    Lors de l'héritage, tu as un masquage automatique des noms dans la classe dérivée
    Oui, mais normalement la classe héritée doit pouvoir accéder à toutes les méthodes de la classe mère comme si c'était ses propres mérhodes.
    Est ce que le problème est liée aux templates ?
    Merci.

  6. #6
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    Citation Envoyé par mehdi_me85 Voir le message
    Bonjour tout le monde.

    Oui, mais normalement la classe héritée doit pouvoir accéder à toutes les méthodes de la classe mère comme si c'était ses propres mérhodes.
    Est ce que le problème est liée aux templates ?
    Merci.
    Tu amènes deux fois le même symbole dans la portée courante, il y a donc ambiguïté, qu'il y ait des templates ou non.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

Discussions similaires

  1. System - Event / Template => undefined reference
    Par Whyzix dans le forum Langage
    Réponses: 8
    Dernier message: 06/04/2010, 23h18
  2. Events dans un template
    Par ludogoal dans le forum Windows Presentation Foundation
    Réponses: 4
    Dernier message: 30/04/2008, 09h57
  3. appliquer plusieurs templates
    Par Manu_Just dans le forum XSL/XSLT/XPATH
    Réponses: 7
    Dernier message: 04/04/2003, 16h26
  4. template match="node() mais pas text()"
    Par Manu_Just dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 26/03/2003, 10h52
  5. [XSLT] template
    Par demo dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 09/09/2002, 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