Template, spécialisations et définitions multiples.
Soit la définition suivante
T.hxx:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| class MaClasse
{
public:
template<class T> T MaFonction();
};
template<>
int MaClasse::MaFonction<int>()
{
return 3;
}
template<>
double MaClasse::MaFonction<double>()
{
return 2.0;
} |
Ensuite, j'ai:
A.cpp:
Code:
1 2 3 4 5 6 7 8
| #include "T.hxx"
void MaFonctionA()
{
MaClasse L_oObjet;
L_oObjet.MaFonction<int>();
L_oObjet.MaFonction<double>();
} |
et B.cpp:
Code:
1 2 3 4 5 6 7 8
| #include "T.hxx"
void MaFonctionB()
{
MaClasse L_oObjet;
L_oObjet.MaFonction<int>();
L_oObjet.MaFonction<double>();
} |
Lorsque je compile, j'obtiens avec Visual Express et gcc, une erreur au link. Les fonctions MaClasse::MaFonction<int>(void) et MaClasse::MaFonction<double>(void) sont définies deux fois.
Si je change comme ça:
T.hxx
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| class MaClasse
{
public:
template<class T> T MaFonction();
template<>
int MaFonction<int>()
{
return 3;
}
template<>
double MaFonction<double>()
{
return 2.0;
}
}; |
Ca compile avec Visual, mais gcc me retourne une erreur:
Citation:
Envoyé par gcc
explicit specialization in non-namespace scope `class MaClasse'
Du coup, troisième essai:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| class MaClasse
{
public:
template<class T> inline T MaFonction();
};
template<>
inline int MaClasse::MaFonction<int>()
{
return 3;
}
template<>
inline double MaClasse::MaFonction<double>()
{
return 2.0;
} |
Là ça marche. Mais est-ce sûr comme solution (mot clé inline explicite)? J'ai cru comprendre que le mot clé inline pouvait ne pas être pris en compte par le compilateur. Donc, est-ce que je ne risque pas d'avoir de mauvaises surprises avec d'autres options de compilations ou avec d'autres compilateurs?
Merci.