Soit la définition suivante
T.hxx:
Ensuite, j'ai:
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; }
A.cpp:
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 MaFonctionA() { 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.
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>(); }
Si je change comme ça:
T.hxxCa compile avec Visual, mais gcc me retourne une erreur:
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; } };Du coup, troisième essai:Envoyé par gcc
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?
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; }
Merci.
Partager