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 :

Surcharge de méthodes template => no matching function


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 33
    Points : 27
    Points
    27
    Par défaut Surcharge de méthodes template => no matching function
    Bonjour,

    Voila j'ai un petit problème, enfin plutôt qqchose que je ne comprends pas ..
    Exemple simple :
    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
     
    template<typename T>
    class TClass
    {
    public:
      T mean() { return (T)666; }
    };
     
    class Test : public TClass<float>
    {
    public:
      float mean(uint i) { return 555.0; }  
    };
     
    int
    main()
    {  
      Test t;
      std::cout << t.mean() << std::endl;
     
      return EXIT_SUCCESS;
    }
    Voila le problème : quand on surcharge une méthode d'un classe template, on ne peux plus avoir accès a la méthode de base... Si on commente la surcharge de méthode dans la classe Test cela marche...

    POURQUOI ? je ne comprends pas ...

    Quelle est la solution, a part ajouter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    float mean() { return TClass<float>::mean(); }
    dans la classe Test ???

    Cordialement

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Points : 1 086
    Points
    1 086
    Par défaut
    Ce ne serait pas simplement un problème de masquage de fonction ?

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 33
    Points : 27
    Points
    27
    Par défaut
    Euuuh ... oui en effet, cela marche ....

    Le compilateur permet de surcharger des méthodes dans une même classe alors pourquoi ce système n'est pas étendu sur les classes dérivées ?

  4. #4
    Membre éprouvé

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Points : 1 086
    Points
    1 086
    Par défaut
    J'ai eu beau chercher, je n'ai jamais trouvé la raison technique qui justifiait le masquage de fonction. Si quelqu'un sait, je suis preneur.

  5. #5
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par cob59 Voir le message
    J'ai eu beau chercher, je n'ai jamais trouvé la raison technique qui justifiait le masquage de fonction. Si quelqu'un sait, je suis preneur.
    C'est juste une consequence de la regle generale, on arrete de chercher dans les portees englobantes quand on a trouve des definitions dans une portee. Ca marche pour les blocs, pour les namespaces et pour les classes (la classe mere etant consideree comme une portee englobant la classe fille).

    C'est ce qui permet a
    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
     
    { 
       int i;
       {
          int i;
       }
    }
     
    namespace n1 {
       int i;
       namespace n2 {
          int i;
       }
    }
     
    struct M { int i; };
    struct F: M {int i; };
    de fonctionner. Il n'y a simplement pas de regle particuliere pour les fonctions incitant a aller chercher des surcharges supplementaires plus loin. Ca a ete propose, mais ca ouvre apparemment(*) autant de cas problematiques que ca facilite les choses (B.S. en parle dans D&E C++, en citant des cas vecus avec g++ qui a implemente un temps une regle alternative), et l'ajout de using pour importer les noms (au moins pour les namespaces et les classes) a offert une solution viable, meme si il faut faire quelque chose manuellement, aux cas ou on veut reellement la surcharge.

    (*) Il me semble que je veux la surcharge systematiquement, je ne sais pas si c'est parce que je ne remarque pas les cas ou ca poserait probleme ou si c'est une question de style; c'est certain que le style a change depuis la fin des annees 80.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  6. #6
    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
    Salut,
    Les fonctions virtuelles en C++ : XVI. Fonction virtuelle et masquage de fonction et XVII. Fonctions virtuelles et fonctions génériques (template)

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

Discussions similaires

  1. template class & surcharge de méthode
    Par Gébix dans le forum C++
    Réponses: 2
    Dernier message: 27/12/2011, 00h38
  2. [template][surcharge] surchage d'une méthode template
    Par méphistopheles dans le forum Langage
    Réponses: 5
    Dernier message: 21/03/2009, 15h22
  3. Méthode template virtuelle
    Par ced1 dans le forum Langage
    Réponses: 6
    Dernier message: 13/11/2005, 15h14
  4. [Custom Tags] Problème avec une surcharge de méthode
    Par Strab dans le forum Taglibs
    Réponses: 19
    Dernier message: 26/08/2005, 16h34
  5. Comment surcharger la méthode OnClose d'un TFrame ?
    Par sdebrois dans le forum Composants VCL
    Réponses: 2
    Dernier message: 17/01/2005, 20h57

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