Lorsque vous travaillez avec des modèles de classe, la spécialisation explicite des fonctions membres est une exigence courante. Cependant, dans les cas où le modèle de classe lui-même devient un modèle, des erreurs peuvent survenir en raison d'une approche incorrecte.
Considérez le scénario suivant :
template <class C> class X { public: template <class T> void get_as(); }; template <class C> void X<C>::get_as<double>() { }
Ce code tente de spécialiser explicitement un membre fonction du modèle de classe X pour le type double. Cependant, lorsque X lui-même devient un modèle, le compilateur signale des erreurs :
error: template-id 'get_as<double>' in declaration of primary template error: prototype for 'void X<C>::get_as()' does not match any in class 'X<C>'
La solution consiste également à spécialiser explicitement le modèle de classe environnant. Cela peut être fait en ajoutant un argument de modèle vide à la définition de membre spécialisée :
template <> template <> void X<int>::get_as<double>() { }
Cela spécialisera la fonction membre uniquement pour X
Alternativement, il est possible d'utiliser surcharges pour obtenir le comportement souhaité :
template <class C> class X { template<typename T> struct type { }; public: template <class T> void get_as() { get_as(type<T>()); } private: template<typename T> void get_as(type<T>) { } void get_as(type<double>) { } };
Cette approche repose sur la spécialisation des modèles pour sélectionner la surcharge get_as() appropriée, garantissant que la spécialisation de type double est appliquée comme prévu.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!