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éritage de templates sur trois niveaux


Sujet :

Langage C++

  1. #1
    Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 3
    Points : 3
    Points
    3
    Par défaut Héritage de templates sur trois niveaux
    Bonjour,
    Je dois porter sous g++ du code compilant sous un compilateur Intel (icpc). Or une erreur se produit lorsque j'essai de compiler le code 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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    template <typename T>
    class A
    {
      public:
        ...
      protected:
        int membre1;
    };
     
    template <typename T>
    class B : public A<T>
    {
      using A<T>::membre1;
     
      public:
        ...
      protected:
        ...
    };
     
    template <typename T>
    class C : public B<T>
    {
      using B<T>::membre1;
     
      public:
        ...
      protected:
        ...
    };
    Le problème se pose lors de l'utilisation de la variable membre1 dans la classe C. En effet, g++ me donne alors l'erreur de compilation suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    erreur: « int A<unsigned char>::membre1 » est protégé
    (N.B. : le problème ne semble pas se poser pour la classe B, ce qui me parrait normal)

    Si quelqu'un a une solution, je suis preneur.
    Merci d'avance.

  2. #2
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Le fait est que je me demande pourquoi déclarer un membre avec un accessibilité protected si c'est pour le rendre privé dés le premier héritage...

    Et, surtout, je me demande pourquoi, alors que le membre est déjà devenu privé dans la première classe fille, tu veux le redéclarer à nouveau privé...

    Peut être devrais tu envisager de déclarer ce membre directement dans l'accessibilité private et de créer, selon les besoins, un mutateur et / ou un accesseur qui pourraient, eux, être, toujours selon les besoins, déclarés public ou protected (et qui le resteraient par défaut)
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Salut Koala01,

    Merci de ta réponse.

    Le fait est que je me demande pourquoi déclarer un membre avec un accessibilité protected si c'est pour le rendre privé dés le premier héritage...
    Je n'avais pas réalisé que les appels à "using" modifiaient la visibilité des variables. En les plaçant au bon endroit, ça marche beaucoup mieux.
    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
    template <typename T>
    class B : public A<T>
    {
      public:
        ...
      protected:
        using A<T>::membre1;
        ...
    };
     
    template <typename T>
    class C : public B<T>
    {
      public:
        ...
      protected:
        using B<T>::membre1;
        ...
    };
    Et, surtout, je me demande pourquoi, alors que le membre est déjà devenu privé dans la première classe fille, tu veux le redéclarer à nouveau privé...
    Je tiens juste à préciser que moi je ne veux rien du tout... mais que je dois seulement porter du code qu'on m'a donné .

    Peut être devrais tu envisager de déclarer ce membre directement dans l'accessibilité private et de créer, selon les besoins, un mutateur et / ou un accesseur qui pourraient, eux, être, toujours selon les besoins, déclarés public ou protected (et qui le resteraient par défaut)
    A titre pûrement personnel, j'aurais en effet tendance à faire ça. Mais, comme je l'ai dit plus haut, il s'agit ici de porter du code déjà existant. Or modifier l'interface de ces templates entrainerait beaucoup trop de modifications.

    En tout cas, merci encore et, qui sait... peut être à bientôt.

  4. #4
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par Rabywan Voir le message
    Salut Koala01,

    Merci de ta réponse.


    Je n'avais pas réalisé que les appels à "using" modifiaient la visibilité des variables. En les plaçant au bon endroit, ça marche beaucoup mieux.
    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
    template <typename T>
    class B : public A<T>
    {
      public:
        ...
      protected:
        using A<T>::membre1;
        ...
    };
     
    template <typename T>
    class C : public B<T>
    {
      public:
        ...
      protected:
        using B<T>::membre1;
        ...
    };
    Mais cela ne sert à rien, étant donné que, de toutes manières, A<T>::membre1 est dans un niveau d'accessibilité protégé, donc, par défaut, accessible à toutes les classes qui en héritent (ou qui héritent d'une classe qui en hérite)
    En tout cas, merci encore et, qui sait... peut être à bientôt.
    Sans doutes... je traine souvent par ici
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Mais cela ne sert à rien, étant donné que, de toutes manières, A<T>::membre1 est dans un niveau d'accessibilité protégé, donc, par défaut, accessible à toutes les classes qui en héritent (ou qui héritent d'une classe qui en hérite)
    Sauf qu'il s'agit ici de templates. Or lors d'un héritage de templates, pour pouvoir utiliser les membres protégés de la classe mère, il faut :
    • soit utiliser à chaque fois this->membre
    • soit utiliser à chaque fois ClasseMere<T>::membre
    • soit utiliser un fois pour toutes using ClasseMere<T>::membre;

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 26/03/2013, 09h50
  2. [XL-2007] Faire un tris sur trois niveaux
    Par elglantosimpatico dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 12/03/2013, 19h38
  3. [Mapping] Association refléxive sur différents niveaux d'héritage
    Par Larxene dans le forum Hibernate
    Réponses: 1
    Dernier message: 24/05/2012, 20h03
  4. Héritage sur plusieurs niveaux de user control
    Par lila23 dans le forum Silverlight
    Réponses: 6
    Dernier message: 14/09/2011, 15h18
  5. [Hibernate] Héritage sur plusieurs niveaux
    Par srvremi dans le forum Hibernate
    Réponses: 2
    Dernier message: 31/05/2006, 18h39

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