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 et heritage de l'operateur =


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut template et heritage de l'operateur =
    Bonjour.
    Histoire de jouer avec les lambda, j'ai voulue créer un système de property comme en C#

    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
    enum PropertyAccess
    {
       G = 1,
       S = 2,
       G_S
     
    };
     
    template<typename T,PropertyAccess pa = G_S>
    struct Property
    {
    private :
    //interdit la copie
            Property<T,pa> & operator=(const Property<T,pa> & );
    };
    spécialisation pour le GET
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    template<typename T>
    struct Property<T,G>
    {
        std::function< T ()> GET;
        operator T () {return GET();};
    };
    spécialisation pour le SET
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    template<typename T>
    struct Property< T,S>
    {
         std::function< void ( const  T &)> SET;
         void operator = ( const  T & t) {SET(t);}
    };
    spécialisation pour le GET et le SET qui me pose problème
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template<typename T>
    struct Property<typename T,G_S>
        : public Property< typename T,S>, Property<typename T,G>
    {
    };
    Pour que le compilateur trouve l'operateur = je doit réécrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void operator = ( const  T & t) {SET(t);}
    Alors qu'il en hérite de la spécialisation pour le SET
    Visual 2010 et mingw 4.5.2 me font le même problème.

  2. #2
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Septembre 2006
    Messages : 37
    Par défaut
    Citation Envoyé par yan Voir le message
    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
    enum PropertyAccess
    {
       G = 1,
       S = 2,
       G_S
     
    };
     
    // Le = 2 est inutile.
     
    template<typename T,PropertyAccess pa = G_S>
    struct Property
    {
    private :
    //interdit la copie
            Property<T,pa> & operator=(const Property<T,pa> & );
    // La définition est inutile.
    };
    spécialisation pour le GET et le SET qui me pose problème
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    template<typename T>
    struct Property<typename T,G_S>
        : public Property< typename T,S>, Property<typename T,G>
    {
    };
    // Ce n'est pas ton vrai code, tu ne m'aides pas.
    Pour que le compilateur trouve l'operateur = je doit réécrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void operator = ( const  T & t) {SET(t);}
    Oui, ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    using Property< T, S >::operator=
    La compilation d'une classe template se fait en 2 temps. Dans le premier temps, le compilateur ne cherche pas dans les classes héritées :

    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
    #include <iostream>
     
    int foo() { return 1; }
     
    template< typename T > struct B { 
     
    int foo() { return 0; }
     
    };
     
    template< typename T > struct D: B< T > {
     
    int bar() { return foo(); }
     
    };
     
    int main() {
    D<int> d; std::cout << d.bar() << "\n";
    }
    Dans le cas particulier de operator= ; il génére celui par défaut. Avec ton code,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int main() {                                                                                    
      Property< int, G_S > p;
      Property< int, G_S > q= p;
    }
    fonctionne très bien.

  3. #3
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Ok.
    Je comprend mieux.

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

Discussions similaires

  1. Restreindre le paramètre d'un Template via Heritage
    Par SamAgace dans le forum Langage
    Réponses: 10
    Dernier message: 03/11/2010, 11h43
  2. Polymorphisme, templates et heritages
    Par Swaraj dans le forum Langage
    Réponses: 2
    Dernier message: 25/06/2009, 18h04
  3. Template et heritage
    Par Ange_blond dans le forum Langage
    Réponses: 8
    Dernier message: 04/05/2009, 15h28
  4. template et heritage
    Par deadalnix dans le forum Langage
    Réponses: 13
    Dernier message: 14/08/2008, 11h34
  5. Réponses: 3
    Dernier message: 22/11/2006, 21h10

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