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); } };
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!