Maison > Article > développement back-end > Comment spécialiser correctement et explicitement les fonctions de modèle dans les classes de modèles en C ?
Spécialisation explicite des fonctions de modèle dans les classes de modèles : énigme de syntaxe en C
L'extrait de code donné illustre une énigme de programmation qui survient lorsque l'on tente de spécialiser explicitement une fonction de modèle dans une classe de modèle. Dans Microsoft Visual C 2008 (VC9), le code se compile correctement ; cependant, le même code rencontre une erreur lors de la compilation à l'aide de GCC 4.2 sur un Mac.
GCC nécessite que les spécialisations explicites soient déclarées en dehors de la classe, mais la syntaxe correcte pour ce faire n'est pas claire. La tentative initiale visant à placer la spécialisation explicite en dehors de la classe, comme indiqué ci-dessous, est incorrecte :
template< typename T > template<> inline void C< T >::f< tag >( T ) {}
L'approche correcte implique de transférer les appels vers une fonction membre d'un type partiellement spécialisé. Voici le code corrigé :
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); } };
Cette modification introduit une structure d'assistance qui fournit la fonctionnalité souhaitée tout en adhérant aux exigences de syntaxe de GCC. En séparant la spécialisation explicite de la classe elle-même, le code se compile avec succès et fonctionne 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!