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 :

Spécialisations partiels de template: accès aux membres.


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    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
    Par défaut Spécialisations partiels de template: accès aux membres.
    Bonjour,
    Le code suivant ne compile pas:
    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
     
    template<class T> class A {
    public:
       A(const T&P_oT0) :m_Membre(P_oT0) {}
    protected:
       T m_Membre;
    };
     
    template<> class A<double> {
    public:
       double MaFonction() {return m_Membre*1.5;}
    };
     
    int main()
    {
       A<double> L_aDouble(4.0); // KO
       A<int> L_aInt(4); // OK
       A<char> L_aChar('e'); // OK
       return 0;
    }
    J'ai une erreur m'indiquant que m_Membre est inconnu dans MaFonction et le constructeur A(const T&P_oT0) n'est pas trouvé.
    Je suis obligé de faire:
    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
    template<class T> class A {
    public:
       A(const T&P_oT0) :m_Membre(P_oT0) {}
    protected:
       T m_Membre;
    };
     
    template<> class A<double> {
    public:
       A(const double&P_oT0) :m_Membre(P_oT0) {}
       double MaFonction() {return m_Membre*1.5;}
     
    protected:
       double m_Membre;
    };
     
    int main()
    {
       A<double> L_aDouble(4.0); // OK
       A<int> L_aInt(4); // OK
       A<char> L_aChar('e'); // OK
       return 0;
    }
    J'ai loupé quelque chose? Sinon, si je doit reprendre toute les définitions dans mes spécialisations, cela devient un peu galère...

  2. #2
    Membre émérite
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Par défaut
    Quand tu spécialises une classe template, il faut que tu spécialise toute la classe. Il te manquuait donc la spécialisation double de m_Membre et du constructeur, ce que tu as rajouté dans ton 2e code.

    Cf FAQ.

  3. #3
    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
    Par défaut
    Ok merci. Mais je trouve ça embêtant d'avoir à redéfinir toute la spécialisation.

  4. #4
    Membre émérite
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Par défaut
    C'est le problème avec les classes template. Si je ne me trompe pas, le compilateur peut choisir de ne pas générer la totalité ou une partie du code d'une classe template s'il n'est pas utilisé.
    Tu indiques que tu utilises la spécialisation double de ta classe, le compilateur ne va alors plus s'occuper de l'autre. Mais il ne va également pas trouver tout ce qui l'intéresse dans la spécialisation.

  5. #5
    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
    Par défaut
    J'ai trouvé une demi-solution en passant par une classe parent et en héritant. J'évite la re-définition de mes membres à l'exception bien sûr du constructeur et de la spécialisation de l'héritage:
    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
    template<class T>
    class BaseA
    {
    public:
       BaseA(const T&P_oT0):m_Membre(P_oT0){}
    protected:
       T m_Membre;
    };
     
    template<class T>
    class A :public BaseA<T>
    {
    public:
       A(const T&P_oT0):BaseA(P_oT0){}
    protected:
    };
     
    template<>
    class A<double> :public BaseA<double>
    {
    public:
       A(const double&P_oT0):BaseA(P_oT0){}
       double MaFonction()
       {
          return m_Membre*1.5;
       }
    };

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

Discussions similaires

  1. Accès aux membres d'une structure C
    Par Gulish dans le forum C++
    Réponses: 4
    Dernier message: 22/03/2008, 16h09
  2. Réponses: 15
    Dernier message: 16/05/2007, 16h53
  3. Réponses: 16
    Dernier message: 17/03/2007, 17h31
  4. Réponses: 5
    Dernier message: 01/02/2007, 13h14
  5. Heritage accès aux membres de bases
    Par MAGNUM_HEAD dans le forum C++
    Réponses: 1
    Dernier message: 16/11/2004, 16h41

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