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 ?

Comment spécialiser correctement et explicitement les fonctions de modèle dans les classes de modèles en C ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-26 16:59:09399parcourir

How to Correctly Explicitly Specialize Template Functions within Template Classes in 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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn