Spécialisation explicite d'une fonction membre pour un modèle de classe
Énoncé du problème :
Quand définissant une spécialisation explicite d'une fonction membre pour un modèle de classe, il faut également spécialiser explicitement le modèle de classe environnant pour éviter le compilateur erreurs.
Exemple de code :
Considérez l'extrait de code suivant :
template <class C> class X { public: template <class T> void get_as(); }; template <class C> void X<C>::get_as<double>() { } int main() { X<int> x; x.get_as(); }
Ce code déclenche des erreurs du compilateur car le modèle de classe environnant X est pas explicitement spécialisé.
Solution :
À pour résoudre ce problème, nous devons explicitement spécialiser le modèle de classe environnant, comme indiqué ci-dessous :
template <> template <> void X<int>::get_as<double>() { }
Cette fonction membre spécialisée s'applique uniquement à X
Approche alternative :
Une approche alternative consiste à utiliser des surcharges de fonctions, comme le montre le code suivant :
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 méthode permet une spécialisation explicite sans nécessiter que le modèle de classe environnant soit spécialisé.
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!