Maison > développement back-end > C++ > Pourquoi la spécialisation explicite d'une fonction membre dans une classe de modèle C provoque-t-elle une erreur « Portée non-espace de noms » ?

Pourquoi la spécialisation explicite d'une fonction membre dans une classe de modèle C provoque-t-elle une erreur « Portée non-espace de noms » ?

Mary-Kate Olsen
Libérer: 2024-12-04 06:15:17
original
1026 Les gens l'ont consulté

Why Does Explicit Specialization of a Member Function in a C   Template Class Cause a

Spécialisation explicite dans la portée non-espace de noms

Requête :

Dans une classe de modèle C CConstraint, pourquoi le compilateur génère-t-il l'erreur "Spécialisation explicite dans une portée non-espace de noms" lorsqu'une fonction membre est explicitement spécialisé ?

Réponse :

Le problème se pose car la spécialisation explicite dans CConstraint n'est pas déclarée dans un espace de noms. Selon la norme C 03, section 14.7.3/2, les spécialisations explicites doivent résider dans l'espace de noms du modèle ou, pour les modèles membres, dans l'espace de noms de la classe ou du modèle de classe englobant.

De plus, la section C 03 14.7.3/3 restreint la spécialisation explicite des fonctions membres à moins que la classe conteneur elle-même ne soit explicitement spécialisé.

Solution :

Pour résoudre ce problème, une approche consiste à transférer la fonction membre Verify() vers une fonction gratuite spécialisée définie dans un espace de noms distinct, comme ci-dessous :

namespace detail {
    template <typename TL> void Verify(int, int[]) {}
    template <>            void Verify<int>(int, int[]) {}
}

template<typename T> class CConstraint {
    // ...
    template <typename TL> void Verify(int position, int constraints[]) {
        detail::Verify<TL>(position, constraints);
    }
};
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal