Specialisation de template et erreur de link... [presque resolu] - C++ - Programmation
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.
Marsh Posté le 07-02-2005 à 20:38:42
j'ai rien compris à ces bêtises de trucs soit disant nécessairess
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 :
|
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 |
et non pas
toto int 1 |
Voila pourquoi j'ai ajoute la fonction test() qui oublige l'editeur de lien a regarder la librairie.
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...
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
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 !
Marsh Posté le 08-02-2005 à 11:26:18
Finalement, il suffit d'ajouter
Code :
|
et tout va bien dans le meilleur des mondes (Microsoft...)
Cf : http://msdn.microsoft.com/library/ [...] iation.asp pour plus de details...
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 :
|
Si vous avez une idee, je suis toujours preneur...
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
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...
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!
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 .
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 :
De l'autre, j'ai mon executable :
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