Soit la définition suivante
T.hxx:
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
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : 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
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 : 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
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.