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

Specialisation de template et erreur de link... [presque resolu] - C++ - Programmation

Marsh Posté le 07-02-2005 à 17:50:01    

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
Reply

Marsh Posté le 07-02-2005 à 17:50:01   

Reply

Marsh Posté le 07-02-2005 à 20:18:39    

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

Reply

Marsh Posté le 07-02-2005 à 20:38:42    

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

Reply

Marsh Posté le 08-02-2005 à 08:34:56    

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.

Reply

Marsh Posté le 08-02-2005 à 08:38:54    

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

Reply

Marsh Posté le 08-02-2005 à 08:39:40    

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

Reply

Marsh Posté le 08-02-2005 à 09:12:23    

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 !

Reply

Marsh Posté le 08-02-2005 à 11:26:18    

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

Reply

Marsh Posté le 08-02-2005 à 11:35:09    

vomitif

Reply

Marsh Posté le 08-02-2005 à 13:31:57    

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

Reply

Marsh Posté le 08-02-2005 à 13:31:57   

Reply

Marsh Posté le 08-02-2005 à 14:04:09    

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

Reply

Marsh Posté le 08-02-2005 à 14:36:07    

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

Reply

Marsh Posté le 08-02-2005 à 14:46:20    

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

Reply

Marsh Posté le 18-12-2005 à 21:12:55    

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!

Reply

Marsh Posté le 19-12-2005 à 01:47:33    

export, pas extern.

Reply

Marsh Posté le 19-12-2005 à 12:12:59    

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 :).

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed