Spécialisation explicite d'une fonction de modèle dans une classe de modèle
En C, la spécialisation explicite d'une fonction de modèle au sein d'une classe de modèle peut être délicate problème de syntaxe. Considérez l'extrait de code suivant :
struct tag {}; template< typename T > struct C { template< typename Tag > void f( T ); // declaration only template<> inline void f< tag >( T ) {} // ERROR: explicit specialization in non-namespace scope };
Dans cet exemple, le compilateur génère une erreur lorsqu'il tente de spécialiser explicitement la fonction membre f avec la balise tag. Pour résoudre ce problème, il est nécessaire de déplacer la spécialisation explicite en dehors de la classe, mais la syntaxe appropriée n'est pas immédiatement évidente.
La solution fournie suggère d'utiliser une structure d'assistance avec des fonctions de membre statiques pour transférer les appels vers le membre spécialisé. function :
template<class T, class Tag> struct helper { static void f(T); }; template<class T> struct helper<T, tag1> { static void f(T) {} }; template<class T> struct C { // ... template<class Tag> void foo(T t) { helper<T, Tag>::f(t); } };
Avec cette approche, la spécialisation explicite est contenue dans une structure non imbriquée, satisfaisant aux exigences de la syntaxe de spécialisation explicite.
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!