Bonjour à tous, j'ai une fonction template que j'ai spécialisé, mes fonctions sont regroupées dans un fichier "TemplateFunction.h" :
J'ai ensuite deux classes qui utilisent ces fonctions:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 #ifndef TEMPLATE_FUNCTION_H #define TEMPLATE_FUNCTION_H #include <string> #include <iostream> template<typename T> void f(T& elt) { std::cout << elt << std::endl; } template<> void f<int>(int& elt) { std::cout << "je suis un int " << elt << std::endl; } template<> void f<std::string>(std::string& elt) { std::cout << "je suis une string " << elt << std::endl; } #endif
avec le cpp:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 #ifndef CLASSA_H #define CLASSA_H struct ClassA { int val; void methode(); }; #endif
et la classe B:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 #include "ClassA.h" #include "TemplateFunction.h" void ClassA::methode() { f<int>(val); }
avec son cpp:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 #ifndef CLASSB_H #define CLASSB_H #include <string> struct ClassB { std::string val; void methode(); }; #endif
jusque là rien de très compliqué, le seul truc c'est que lorsque dans mon main je fais:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 #include "ClassB.h" #include "TemplateFunction.h" void ClassB::methode() { f<std::string>(val); }
J'ai l'erreur de compilation suivante:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 #include <iostream> int main() { ClassA a; ClassB b; a.val = 10; b.val = "toto"; a.methode(); b.methode(); return 0; }
J'ai vérifié que si je met le corps des méthodes dans le .h (et en virant les cpp), ça compile, le truc c'est que je vois pas pourquoi lorsque c'est dans les cpp le compilo râle. (PS: j'utilise VS2003)ClassA.obj : error LNK2005: "void __cdecl f<int>(int &)" (??$f@H@@YAXAAH@Z) déjà défini(e) dans main.obj
Partager