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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    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 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 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
    @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 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
    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).

+ 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