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 :

Hériter d'une classe template, accès aux données/fonctions de la classe de base


Sujet :

Langage C++

  1. #1
    Membre éclairé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2007
    Messages
    373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2007
    Messages : 373
    Points : 765
    Points
    765
    Par défaut Hériter d'une classe template, accès aux données/fonctions de la classe de base
    Bonjour,

    Supposons que l'on soit dans le cas suivant :
    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
    template <typename T>
    class Mere
    {
    public :
        int truc;
    };
     
    template <typename T>
    class Fille : public Mere<T>
    {
        void uneFonction()
        {
            ++truc; // #
        }
    };
    Ce code ne compile pas, gcc lance l'erreur à la ligne # :
    error: 'truc' was not declared in this scope
    Pour que ça compile, il faut préciser à chaque fois Mere<T>::truc au lieu de truc.

    J'ai donc deux questions :
    • pourquoi ?
    • comment éviter d'avoir à préciser Mere<T>:: devant chaque référence à un membre (ou fonction membre) de la classe de base ? Doit-on ajouter une directive using dans la classe dérivée pour chaque membre / fonction membre de la classe de base ? Ou utiliser this-> ?

  2. #2
    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
    Quand on cherche la définition d'un identificateur dans un template, pour que cette définition puisse être trouvée dans quelque chose qui dépend des paramêtres templates, il faut que l'identificateur soit clairement dépendant de ceux-ci. La raison est qu'on veut éviter qu'une définition dépendante prenne la priorité sur une autre de manière inattendue (imagine dans ton cas une définition globale de truc, on trouverait parfois la définition globale(*), parfois celle de Mere).

    Donc ici, il faut rendre truc dépendant du paramètre template, le qualifier avec Mere<T>:: ou avec this-> sont deux solutions (la deuxième est la plus courante d'après mon expérience).

    (*) Dans ton cas où tu hérites de Mere<T>, ça peut sembler moins évident que si tu héritais directement de T, mais avec les spécialisations, c'est toujours possible.

  3. #3
    Membre éclairé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2007
    Messages
    373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2007
    Messages : 373
    Points : 765
    Points
    765
    Par défaut
    Merci beaucoup pour cette explication, je n'y avais pas pensé.

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

Discussions similaires

  1. Création d'une classe d'accès aux données
    Par PlayerOne dans le forum Accès aux données
    Réponses: 15
    Dernier message: 15/09/2009, 12h24
  2. instanciation d'une classe d'acces aux données
    Par tortuegenie dans le forum ASP.NET
    Réponses: 12
    Dernier message: 10/09/2009, 11h55
  3. [Debutant] Classe d'acces aux données
    Par Keldrhyn dans le forum Access
    Réponses: 4
    Dernier message: 18/02/2007, 20h30
  4. Réponses: 5
    Dernier message: 24/05/2006, 23h53
  5. Réponses: 13
    Dernier message: 23/02/2006, 11h42

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