Classe de modèle avec fonction membre explicitement spécialisée
Lors de la définition d'une spécialisation explicite pour une fonction membre d'un modèle de classe, un piège courant se produit lorsque le modèle de classe environnant est également un modèle. Pour comprendre le problème, considérons l'exemple suivant :
#include <iostream> #include <cmath> template <class C> class X { public: template <class T> void get_as(); }; template <class C> void X<C>::get_as<double>() {} // Explicit specialization for double int main() { X<int> x; x.get_as(); }
Ce code tente de spécialiser explicitement la fonction membre get_as pour double pour le modèle de classe X. Cependant, cette approche entraîne des erreurs de compilation car le modèle de classe environnant n'est pas explicitement spécialisé.
Approche incorrecte :
Tentative de spécialisation explicite de la fonction membre sans spécialiser la classe le modèle, comme indiqué ci-dessous, est incorrect :
template <class C> template<> void X<C>::get_as<double>() {}
Correct Solution :
Pour résoudre le problème, le modèle de classe et la fonction membre doivent être explicitement spécialisés. Par exemple, pour spécialiser la fonction get_as uniquement pour X
template <> template <class T> void X<int>::get_as() {} template <> void X<int>::get_as<double>() {}
Option alternative :
Alternativement, pour conserver l'environnement modèle de classe non spécialisé, une surcharge de la fonction get_as peut être utilisée, comme démontré dans 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>) {} };
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!