problème de spécialisation template
Bonjour à tous, j'ai une fonction template que j'ai spécialisé, mes fonctions sont regroupées dans un fichier "TemplateFunction.h" :
Code:
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 |
J'ai ensuite deux classes qui utilisent ces fonctions:
Code:
1 2 3 4 5 6 7 8 9 10 11
| #ifndef CLASSA_H
#define CLASSA_H
struct ClassA
{
int val;
void methode();
};
#endif |
avec le cpp:
Code:
1 2 3 4 5 6 7
| #include "ClassA.h"
#include "TemplateFunction.h"
void ClassA::methode()
{
f<int>(val);
} |
et la classe B:
Code:
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 |
avec son cpp:
Code:
1 2 3 4 5 6 7
| #include "ClassB.h"
#include "TemplateFunction.h"
void ClassB::methode()
{
f<std::string>(val);
} |
jusque là rien de très compliqué, le seul truc c'est que lorsque dans mon main je fais:
Code:
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 l'erreur de compilation suivante:
Citation:
ClassA.obj : error LNK2005: "void __cdecl f<int>(int &)" (??$f@H@@YAXAAH@Z) déjà défini(e) dans main.obj
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)