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

C++ Discussion :

Problèmes de linking avec templates


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut Problèmes de linking avec templates
    Hello,

    J'ai une foultitude de déclarations de templates, telles que celles-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ............
    template < typename TYP > bool getMayaAttr(const MFnDependencyNode &depFn, const char *aName, AtRGB &value) const;
    template < typename TYP > bool getMayaAttr(const MFnDependencyNode &depFn, const char *aName, AtRGBA &value) const;
    template < typename TYP > bool getMayaAttr(const MFnDependencyNode &depFn, const char *aName, MColor &value) const;
    template < typename TYP > bool getMayaAttr(const MFnDependencyNode &depFn, const char *aName, MVector &value) const;
    template < typename TYP > bool getMayaAttr(const MFnDependencyNode &depFn, const char *aName, MPoint &value) const;
    ............
    Les définitions des spécialisations suivent dans le code.

    Parmi ces spécialisations, une me pose problème (dans le morceau de code plus haut, il s'agit de la troisème, avec MColor).

    Pour simplifier les choses, voici sa définition, qui figure plus bas dans le même fichier, parmi les autres définitions de spécialisations :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template <> inline
    bool AmNode::getMayaAttr(const MFnDependencyNode &depFn, const char *aName, MColor &value) const
    {
    	return true;
    }
    Le problème est que pour cette spécialisation, je reçois une erreur lors du linking :

    error LNK2019: symbole externe non résolu "public: bool __thiscall AmNode::getMayaAttr<class MColor>(class MFnDependencyNode const &,char const *,class MColor &)const " (??$getMayaAttr@VMColor@@@AmNode@@QBE_NABVMFnDependencyNode@@PBDAAVMColor@@@Z) référencé dans la fonction "public: int __thiscall AmNode::updateColor(class MFnDependencyNode const &,char const *,char const *,struct s_Node *)const " (?updateColor@AmNode@@QBEHABVMFnDependencyNode@@PBD1PAUs_Node@@@Z)

    Les autres spécialisations n'ont pas été faites par moi, mais j'ai fait exactement la même chose (il me semble), et je ne sais pas ce que suis censé faire de plus.

    Une idée ?

    Merci.

  2. #2
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template <> inline
    bool AmNode::getMayaAttr(const MFnDependencyNode &depFn, const char *aName, MColor &value) const
    {
    	return true;
    }
    Il y a peut-être quelque chose qui m'a échappé, mais je crois qu'une spécialisation de fonction template se fait plutôt ainsi (exemple pour spécialisation avec TYP=int) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template <> inline
    bool AmNode::getMayaAttr<int>(const MFnDependencyNode &depFn, const char *aName, MColor &value) const
    {
    	return true;
    }

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut cela résoud effectivement mon problème, mais...
    Hmmm... Merci de ton intervention...

    En fait, ce n'était pas une kyrielle de spécialisations, mais une ribambelle de surcharges... N'étant pas encore très expérimenté avec les templates, ça ne m'avait pas sauté aux yeux. Et comme les appels que je faisais aux fausses spécialisations les considéraient comme telles (c'est-à-dire que je précisais le type dans l'appel, entre les <>), ça couinait.

    Il va maintenant falloir que je détermine l'intérêt de ces templates, car je ne vois pas de spécialisations, mais seulement des surcharges...

    Merci, en tout cas !

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut Je suis mauuuvaiiis....
    En fait, ce n'est pas clair, dans ma tête.

    Quelle est la différence entre ces deux méthodes de "spécialisation" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    template < typename TYP >
    bool AmNode::getMayaAttr(const MFnDependencyNode &depFn, const char *aName, TYP &value) const
    {...}
     
    template <> inline
    bool AmNode::getMayaAttr<unsigned char>(const MFnDependencyNode &depFn, const char *aName, unsigned char &value) const
    {...}
    appelée avec <unsigned char>

    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    template < typename TYP >
    bool AmNode::getMayaAttr(const MFnDependencyNode &depFn, const char *aName, TYP &value) const
    {...}
     
    template <> inline
    bool AmNode::getMayaAttr(const MFnDependencyNode &depFn, const char *aName, unsigned char &value) const
    {...}
    appelée avec <>

    ??

  5. #5
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    La seconde n'est pas valide, a priori. Pour une spécialisation template on spécifie toujours les paramètres spécialisés entre < >.

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Je ne sais pas si la seconde est non académique, mais pourtant, elle fonctionne.

    Ce qui me laisse perplexe...

    Peut-être faut-il enquêter sur les performances ?

    De multiples surcharges d'une spécialisation générique sont-elles plus performantes que de multiples spécialisations ? Ou l'inverse ?...

  7. #7
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    Je viens de vérifier, et en effet, elle fonctionne avec le compilo de visual2005. Mais cela ne signifie pas que cette syntaxe respecte le standard

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

Discussions similaires

  1. Problème de link avec winsock2.h
    Par sebh dans le forum Windows
    Réponses: 5
    Dernier message: 25/04/2008, 11h01
  2. Réponses: 2
    Dernier message: 15/03/2007, 12h10
  3. problème de link avec visual C++ 2005
    Par superC dans le forum OpenGL
    Réponses: 2
    Dernier message: 27/02/2007, 10h35
  4. [Code::Blocks] problème de link avec DevIL
    Par theidiot dans le forum DevIL
    Réponses: 4
    Dernier message: 01/10/2006, 18h26
  5. Problème de link avec Borland C++ 5.5
    Par gelam dans le forum Autres éditeurs
    Réponses: 5
    Dernier message: 24/11/2003, 16h45

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