Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1841 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Specialisation de template et erreur de link... [presque resolu]

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Specialisation de template et erreur de link... [presque resolu]

n°974403
bb138
La vie est belle ...
Posté le 07-02-2005 à 17:50:01  profilanswer
 

Bonjour,
 
Voila encore un autre probleme que je rencontre sous VS 7.1.
 
D'un cote je cree une lib avec les fichiers suivants :

Code :
  1. // lllll.h
  2. #ifndef lllll_HEADER
  3. #define lllll_HEADER
  4. #include <iostream>
  5. using namespace std ;
  6. void test() ;  // <- necessaire sinon l'executable n'est pas lie a la lib
  7. template <typename T>
  8. void
  9. toto( void ) {
  10. cout << "toto 1\\n" ;
  11. }
  12. #endif


Code :
  1. // lllll.cpp
  2. #include "lllll.h"
  3. template <>
  4. void
  5. toto<int>( void ) {
  6. cout << "toto int 1\\n" ;
  7. }
  8. void test(){
  9. cout << "test\\n" ;
  10. }


De l'autre, j'ai mon executable :

Code :
  1. // ttttt.cpp
  2. #include <lllll.h>
  3. int main()
  4. {
  5. test() ;  // <- necessaire pour un link correct avec la lib
  6. toto<int>() ;
  7. toto<double>() ;
  8. return 0 ;
  9. }


La compilation de la librairie s'effectue normalement (sans erreur), par contre l'editeur de lien me retourne

lllll.lib(lllll.obj) : error LNK2005: "void __cdecl toto<int>(void)" (??$toto@H@@YAXXZ) déjà défini(e) dans ttttt.obj


Ce meme code compile avec gcc 3.3 ne pose aucun probleme particulier...
Avez-vous une idee sur la question ?
Merci a vous.


Message édité par bb138 le 08-02-2005 à 14:46:46
mood
Publicité
Posté le 07-02-2005 à 17:50:01  profilanswer
 

n°974670
el muchach​o
Comfortably Numb
Posté le 07-02-2005 à 20:18:39  profilanswer
 

Essaye de mettre ta spécialisation de template dans le .h que tu inclus dans les deux binaires, pour voir.

n°974688
Taz
bisounours-codeur
Posté le 07-02-2005 à 20:38:42  profilanswer
 

j'ai rien compris à ces bêtises de trucs soit disant nécessairess

n°975062
bb138
La vie est belle ...
Posté le 08-02-2005 à 08:34:56  profilanswer
 

Citation :

Taz   j'ai rien compris à ces bêtises de trucs soit disant nécessairess


Disons que si je ne met pas

Code :
  1. test() ;  // <- necessaire pour un link correct avec la lib

dans mon main, la compilation et l'edition de lien s'effectuent normalement sans erreur. Cependant, lors de l'execution la sortie est la suivante :

toto 1
toto 1

et non pas

toto int 1
toto 1


Voila pourquoi j'ai ajoute la fonction test() qui oublige l'editeur de lien a regarder la librairie.

n°975064
bb138
La vie est belle ...
Posté le 08-02-2005 à 08:38:54  profilanswer
 

Citation :

el muchacho   Essaye de mettre ta spécialisation de template dans le .h que tu inclus dans les deux binaires, pour voir.

Oui, j'ai aussi essaye cette methode, mais il me retourne toujours la meme erreur...
J'ai peut etre oublie une option dans les proprietes de mon projet, mais je ne vois vraiment pas laquelle...

n°975065
Taz
bisounours-codeur
Posté le 08-02-2005 à 08:39:40  profilanswer
 

DEGAGE toutes ces définitions de test() qui ne sont pas template. Si non tu te fais avoir par les mécanismes de résolution. Ton compilateur devrait d'ailleurs t'avertir

n°975089
bb138
La vie est belle ...
Posté le 08-02-2005 à 09:12:23  profilanswer
 

Si j'enleve toutes les declarations/definitions/appels de test(), lacompilation et l'edition de lien s'effectue correctement.
MAIS, la specialisation de la fonction template toto n'est pas prise en compte !

n°975209
bb138
La vie est belle ...
Posté le 08-02-2005 à 11:26:18  profilanswer
 

Finalement, il suffit d'ajouter

Code :
  1. extern template void toto<int>( void ) ;

et tout va bien dans le meilleur des mondes (Microsoft...)
 
Cf : http://msdn.microsoft.com/library/ [...] iation.asp pour plus de details...

n°975217
Taz
bisounours-codeur
Posté le 08-02-2005 à 11:35:09  profilanswer
 

vomitif

n°975334
Joel F
Real men use unique_ptr
Posté le 08-02-2005 à 13:31:57  profilanswer
 

mais c'est n'importe-quoi o.O

mood
Publicité
Posté le 08-02-2005 à 13:31:57  profilanswer
 

n°975382
bb138
La vie est belle ...
Posté le 08-02-2005 à 14:04:09  profilanswer
 

C'est ce que je pense aussi...
 
D'ailleurs, je conserve toujours mon vrai probleme qui m'a amene a exposer cet exemple :
En fait ma fonction est une fonction template membre d'une classe non template. Dans ce cas, je n'arrive pas a m'en sortir avec la magouille Microsoft du extern... du style :

Code :
  1. extern template int maClasse::maFonction<int>(...) ;

Si vous avez une idee, je suis toujours preneur...

n°975411
Taz
bisounours-codeur
Posté le 08-02-2005 à 14:36:07  profilanswer
 

déjà que la portée par défaut d'une fonction est externe, c'est pas à coup de pléonasme qu'on va s'en sortir

n°975433
bb138
La vie est belle ...
Posté le 08-02-2005 à 14:46:20  profilanswer
 

Je veux bien mais mon probleme reste entier...
 
La seule chose vraiment pas propre qui me permet d'obtenir un resultat a peut pres acceptable c'est l'utilisation de

/FORCE:MULTIPLE

au niveau de l'editeur de lien et la definition de la specialisation du template au bon endroit dans mon fichier d'en-tete...

n°1269605
super-tupa​pau
Posté le 18-12-2005 à 21:12:55  profilanswer
 

bonjour,
 
j'ai le même problème mais avec gcc 3.3.6.
j'ai un template qui fait partie d'une librairie partagé que j'ai crée mais quand je veux l'instancer dans un prog il ne trouve pas les méthodes du templates.
Pour le mot clef extern je l'ai déjà vu dans de la doc ms il dise qu'aucun compilateur ne l'implémente!

n°1269662
farib
Posté le 19-12-2005 à 01:47:33  profilanswer
 

export, pas extern.

n°1269832
super-tupa​pau
Posté le 19-12-2005 à 12:12:59  profilanswer
 

oui, excuse export n'est tjr pas supporté par les compilateurs :( enfin j'ai trouvé une autre solution que le template pour mon probléme :).


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Specialisation de template et erreur de link... [presque resolu]

 

Sujets relatifs
Inversion de couleurs [Résolu]erreur sur une commande MySql...
[Résolu] Pb dans mon code javascriptmessage déjà lu [Résolu]
erreur inattendue - parse error, unexpected T_ELSEPetite boucle qui ne marche pas.... [Résolu]
Surcharge de template et visual C++ .NET[php][expressions régulières]Retour chariot[resolu]
[resolu]utiliser un ejb entity depuis un ejb session[wxWidget] Double buffering [Résolu]
Plus de sujets relatifs à : Specialisation de template et erreur de link... [presque resolu]


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR