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 :

constructeur template dans une classe template


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2010
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2010
    Messages : 80
    Par défaut constructeur template dans une classe template
    Bonjour,

    j'ai créé une classe template, dans laquelle je veux ecrire un constructeur qui dépend d'un parametre template. En gros ca ressemble à ca :

    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
     
     
    enum methodes
    {
          premiere = 0,
          deuxieme = 1,
    } ;
     
    template <typename T>
    class maclasse
    {
           T    champ1 ;
           int  champ2 ;
     
        public:
           template <int methode>
           maclasse (T a, int b) ;
    } ;
     
    template <typename T> template <premiere>
    maclasse<T>::maclass(T c1,  int c2) { code... }
     
    template <typename T> template <deuxieme>
    maclasse<T>::maclasse(T c1,  int c2) { autre code... }
    problème : il me dit syntax error : identifier "premiere"

    Je ne vois pas trop comment faire et un peu d'aide serait la bienvenue. D'ailleurs je ne sais même pas s'il est possible de templater le constructeur...
    Merci beaucoup.

  2. #2
    Membre Expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Par défaut
    Essaie ça ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    template <> template <premiere>
    maclasse<T>::maclass(T c1,  int c2) { code... }
     
    template <> template <deuxieme>
    maclasse<T>::maclasse(T c1,  int c2) { autre code... }

    edit> Heu non c'est pas bon du tout

  3. #3
    Membre confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2010
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2010
    Messages : 80
    Par défaut
    Salut,

    merci mais ça me fait pareil...

  4. #4
    Membre Expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    template <typename T> 
    maclasse<T>::template maclass<premiere>(T c1,  int c2) { code... }
    J'avais mal lu ton code (syntaxe ninja oblige), essaie plutot quelque chose comme ça voir.


    edit> J'ai pas de quoi vérifier sous la main mais il se peut que cette variante marche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    template <typename T> 
    maclasse<T>::template<> maclass<premiere>(T c1,  int c2) { code... }

  5. #5
    Membre confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2010
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2010
    Messages : 80
    Par défaut
    Non plus
    le compilo (cl) me dit que maclasse n'est pas une fonction

    J'en déduis (à tort?) qu'on ne peut que templater des fonctions et pas le constructeur dans une classe template.

    C'est dommage, mais je vais changer la signature de mon constructeur en ajoutant premiere et deuxieme en paramètre à la fin de mon constructeur...

    Merci beaucoup, et si qqn a des idées sur le sujet, je suis toujours preneur!

    Zou

  6. #6
    Membre Expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Par défaut
    Il me semble bien que si mais la syntaxe est souvent obscure et j'ai tendance a l'oublier... j'ai du faire un truc semblable une fois auparavant mais je me souvient pas de l'issue. (et j'ai pas de compilo de libre sous la main, mais je tenterai tout a l'heure ...)

  7. #7
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    J'ai pas tout lu, mais je desire rappeler qu'il est impossible de specialiser un membre template d'une classe template uniquement sur les parametres templates du membre, il faut aussi specialiser explicitement sur les parametres templates de la classe.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Juste pour rajouter que un non-type parameter peut-etre specifier au compilo, via une classe qui permet d'associer un type à un entier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    template<int I>
    class Int2Type{};  // cf Modern C++
     
    class Foo
    {
          template<int I>
          Foo( Int2Type<I> const&);
    };
     
    // utilisation :
     
    Foo a( Int2Type<1>());
    Foo b( Int2Type<2>());

  9. #9
    Membre éprouvé Avatar de nowahn
    Homme Profil pro
    Inscrit en
    Août 2008
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 84
    Par défaut
    @regis.portalez :

    Pour résoudre ton problème sans surcharge à l’exécution, je pense que tu peux utiliser un paramètre supplémentaire au constructeur :
    Code C++ : 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
    class methode1 {};
    class methode2 {};
     
    template <typename T>
    class maclasse
    {
           T    champ1 ;
           int  champ2 ;
     
        public:
           maclasse (T a, int b, methode1) ; // dernier paramètre non nommé.
           maclasse (T a, int b, methode2) ;
    } ;
     
    template<typename T>
    maclasse<T>::maclasse(T a, int b, methode1)
    {
       // code n’utilisant pas la classe methode1
    }
     
    template<typename T>
    maclasse<T>::maclasse(T a, int b, methode2)
    {
       // code n’utilisant pas la classe methode2,
       // mais code différent du constructeur précédent.
    }
     
    // utilisation :
    maclasse<float> objet1(0.0, 0, methode1());
    maclasse<float> objet2(0.0, 0, methode2());
    À priori, le dernier paramètre des constructeurs sera éliminé de l’exécutable (après que le constructeur a été choisi à la compilation par le mécanisme de surcharge de fonction) même par le plus pourri des optimiseurs.
    La limitiation de ce code est que pour rajouter une troisième politique, il faut rajouter un troisième constructeur. Ceci devrait être un travail pour les modèles (template), mais c’est justement le sujet le l’autre sujet que j’ai ouvert ...

  10. #10
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 033
    Billets dans le blog
    12
    Par défaut
    C'est sur ce principe qu'est défini le constructeur par conversion des shared_ptr de boost/tr1 (cf. static_pointer_cast, const_pointer_cast et dynamic_pointer_cast)
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 22/11/2010, 14h15
  2. Réponses: 4
    Dernier message: 20/10/2009, 08h54
  3. Réponses: 8
    Dernier message: 20/07/2007, 14h28
  4. Réponses: 9
    Dernier message: 19/05/2007, 15h28
  5. Réponses: 4
    Dernier message: 08/11/2005, 15h10

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