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 - Spécialisation de membre statique


Sujet :

Langage C++

  1. #1
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 034
    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 034
    Billets dans le blog
    12
    Par défaut Template - Spécialisation de membre statique
    Bonjoir !

    Je rencontre un problème avec mes spécialisations de templates, sous Gcc mais pas sous Visual Studio.
    Comme un bout de code est plus parlant...

    Dans Factory.hpp j'ai ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
       template <class Obj, class Key=String>
       class Factory
       {
       private:
          typedef shared_ptr<Obj> obj_ptr;
          typedef std::map<Key, obj_ptr> obj_map;
          static obj_map m_mapRegistered;
       public:
          // des fonctions qui vont bien
       };
    Dans Light.cpp j'ai ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Factory<LightCategory, eLIGHT_TYPE>::obj_map Factory<LightCategory, eLIGHT_TYPE>::m_mapRegistered;
    Si j'essaie de compiler comme ça il me sort comme erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error: specializing member 'Factory<LightCategory, eLIGHT_TYPE>::m_mapRegistered' requires 'template<>' syntax
    Je me dis "Ok, on va faire ce qu'il demande" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    template <> Factory<LightCategory, eLIGHT_TYPE>::obj_map Factory<LightCategory, eLIGHT_TYPE>::m_mapRegistered;
    Et là il me met l'erreur de link suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    référence indéfinie vers Factory<LightCategory, eLIGHT_TYPE>::m_mapRegistered
    ???
    Qu'est-ce que j'ai fait de mal ? (au cas où la question vous viendrait à l'esprit, le fichier Light.cpp est bel et bien inclus dans le projet).
    Je reprécise que ces erreurs arrivent uniquement sous gcc et pas sous VisualStudio.
    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).

  2. #2
    Membre confirmé Avatar de BigNic
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 195
    Par défaut
    vue ta 1ere déclaration c'est classe qui est template pas les membre de ta classe, donc tu ne peux pas spécialiser les méthodes seulement tu dois spécialiser ta classe entièrement ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     template<>
    class Factory<LightCategory, eLIGHT_TYPE>
    {
       // des fonctions qui vont bien
    };
    et tes fonctions pourront manipuler m_mapRegistered comme s'il était un map de LightCategory indéxés par des eLIGHT_TYPE

  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
    Salut,
    Faut toujours écouter son compilateur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    template <class Obj, class Key>
    typename Factory<Obj, Key>::obj_map Factory<Obj, Key>::m_mapRegistered;
    donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    template<>
    Factory<LightCategory, eLIGHT_TYPE>::obj_map Factory<LightCategory, eLIGHT_TYPE>::m_mapRegistered;

  4. #4
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 034
    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 034
    Billets dans le blog
    12
    Par défaut
    @3DArchi : Ben c'est ce que j'ai mis mais ça fait une erreur de link.

    @BigNic : Y a vraiment pas d'autre moyen ? Parce que ça m'enlève tout l'intérêt de cette façon de faire ...
    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).

  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
    Salut,

    Citation Envoyé par dragonjoker59 Voir le message
    @3DArchi : Ben c'est ce que j'ai mis mais ça fai une erreur de link.
    Excuses moi, j'ai lu et répondu un peu trop vite...

    Le problème est que lors d'un instanciation (différent d'une spécialisation) d'une classe template, les membres statiques ne sont pas implicitement instanciés. Il faut donc leur donner une définition explicitement :

    Code factory.h : 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 <class Obj, class Key=String>
       class Factory
       {
       private:
          typedef shared_ptr<Obj> obj_ptr;
          typedef std::map<Key, obj_ptr> obj_map;
          static obj_map m_mapRegistered;
       public:
          // des fonctions qui vont bien
       };
     
    template <class Obj, class Key>
    typename Factory<Obj, Key>::obj_map 
         Factory<Obj, Key>::m_mapRegistered;

  6. #6
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 034
    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 034
    Billets dans le blog
    12
    Par défaut
    Merci, je testerai ça lundi !
    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).

  7. #7
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 034
    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 034
    Billets dans le blog
    12
    Par défaut
    Bon, après essai, j'ai toujours la même erreur ...

    @BigNic : en fait je ne veux pas spécialiser les méthodes, elles font le travail générique que je veux (enregistrement, création de nouvelle entité) et je n'ai pas besoin de les spécialiser.

    EDIT :
    Du coup je vais enlever la partie statique de Factory, de toute façon les static c'est mal...
    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).

  8. #8
    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
    Citation Envoyé par dragonjoker59 Voir le message
    Bon, après essai, j'ai toujours la même erreur
    Euh, tu peux montrer ton code. Car j'ai testé et je n'ai plus d'erreur de link (alors que je l'avais bien reproduit avec ton code précédent).

  9. #9
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 034
    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 034
    Billets dans le blog
    12
    Par défaut
    Factory.hpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
       template <class Obj, class Key=String>
       class Factory
       {
       private:
          typedef shared_ptr<Obj> obj_ptr;
          typedef std::map<Key, obj_ptr> obj_map;
          static obj_map m_mapRegistered;
       public:
          // des fonctions qui vont bien
       };
     
       template <class Obj, class Key> typename Factory<Obj, Key>::obj_map  Factory<Obj, Key>::m_mapRegistered;
    Rien de changé ailleurs.

    En tout cas, j'ai viré les variables statiques, qui de toute façon me poseront problème dès que j'appellerai mes factories dans des Dll (j'ai pas mal de plugins dans mon moteur et ces plugins sont dll / shared lib)
    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).

  10. #10
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,
    Citation Envoyé par dragonjoker59 Voir le message
    Factory.hpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
       template <class Obj, class Key=String>
       class Factory
       {
       private:
          typedef shared_ptr<Obj> obj_ptr;
          typedef std::map<Key, obj_ptr> obj_map;
          static obj_map m_mapRegistered;
       public:
          // des fonctions qui vont bien
       };
     
       template <class Obj, class Key> typename Factory<Obj, Key>::obj_map  Factory<Obj, Key>::m_mapRegistered;
    Rien de changé ailleurs.

    En tout cas, j'ai viré les variables statiques, qui de toute façon me poseront problème dès que j'appellerai mes factories dans des Dll (j'ai pas mal de plugins dans mon moteur et ces plugins sont dll / shared lib)
    Heuuu... Est ce une erreur de copier / coller, ou bien tu ne considères pas que m_mapRegistered est une variable statique
    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

  11. #11
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 034
    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 034
    Billets dans le blog
    12
    Par défaut
    Je ne comprends pas ce que tu veux dire.
    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).

  12. #12
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Citation Envoyé par dragonjoker59 Voir le message
    Je ne comprends pas ce que tu veux dire.
    template <class Obj, class Key=String>
    class Factory
    {
    private:
    typedef shared_ptr<Obj> obj_ptr;
    typedef std::map<Key, obj_ptr> obj_map;
    static obj_map m_mapRegistered;
    public:
    // des fonctions qui vont bien
    };

    template <class Obj, class Key> typename Factory<Obj, Key>::obj_map Factory<Obj, Key>::m_mapRegistered;
    m_mapRegistered est une statique de classe, d'où la remarque de koala01.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  13. #13
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 034
    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 034
    Billets dans le blog
    12
    Par défaut
    Oui, et je ne comprends toujours pas ce qui ne va pas, à part le fait d'une variable statique membre d'une classe template que je ne sais pas comment implémenter (la méthode que j'avais utilisée ne fonctionnant pas)

    EDIT :
    J'ai testé dans un projet vide et je n'ai effectivement plus l'erreur de link.
    Donc ça marche, mais comme j'ai passé m_mapRegistered en non statique, ça ne m'est plus utile.
    Je passe en résolu.
    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).

  14. #14
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Citation Envoyé par dragonjoker59 Voir le message
    Oui, et je ne comprends toujours pas ce qui ne va pas
    Dans ton message, tu dis que tu as viré les statiques de classes, hors celle-ci est présente. D'où la réponse de koala01.

    Après, quand à savoir si ça va ou pas...

    Si tu instancie la classe dans un programme et dans une dll, tu auras deux versions de la même variable.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

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

Discussions similaires

  1. Spécialisation template vide (pour membres statiques)
    Par LittleWhite dans le forum Langage
    Réponses: 2
    Dernier message: 17/07/2012, 08h36
  2. Réponses: 3
    Dernier message: 09/04/2009, 11h30
  3. Membre statiques et templates
    Par Plomeg dans le forum C++
    Réponses: 7
    Dernier message: 28/12/2007, 22h28
  4. Réponses: 0
    Dernier message: 25/07/2007, 14h47
  5. Réponses: 19
    Dernier message: 18/03/2007, 16h57

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