[Template] spécialisation fonction membre template, class non template
Bonjour,
j'ai de petits soucis avec la spécialisation d'une fonction membre ; la seule solution que j'ai trouvée étant pour l'instant de la déclarer toujours en inline (VC++ 2005).
Exemple:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| #pragma once
#ifndef __TTESTTEMPLATE__
#define __TTESTTEMPLATE__
class TTestTemplate
{
public:
template<typename T>
int FnctMembre(T t)
{
return 1;
}
// Passe en VC++, mais pas vraiment légal en C++ il me semble
template<>
int FnctMembre<int>(int t)
{
return 2;
}
};
/* Problème à l'édition des liens (la fonction se trouve déclaré dans plusieurs modules)
template<>
int TTestTemplate::FnctMembre<char>(char t)
{
return 3;
}
*/
template<>
inline int TTestTemplate::FnctMembre<double>(double t)
{
return 4;
}
#endif //__TTESTTEMPLATE__ |
Cette spécialisation doit-elle alors toujours être inline ?
Remarque : il m'est déjà arrivé de placer des spécialisations dans un cpp, en ne donnant pas l'implémentation par défaut.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
| // .h
class TTestTemplate
{
public:
template<typename T>
int FnctMembre(T t); // échoue si il n'existe pas une spécialisation adéquate
};
// .cpp
template<>
int TTestTemplate::FnctMembre<char>(char t)
{
return 1;
} |
Mais cela force à ne pas donner l'implémentation par défaut, sinon elle sera utilisée pour générer une spécialisation et entrera en conflit l'autre (de plus je ne suis pas très sur de la légalité d'un tel code :aie:).