Maison >développement back-end >C++ >Pourquoi les spécialisations explicites en dehors d'un espace de noms provoquent-elles des erreurs de compilation en C ?
Problème de spécialisation explicite dans la portée non-espace de noms
Lors de la compilation d'un modèle de classe C avec une spécialisation explicite en dehors d'un espace de noms, certains compilateurs comme g peut générer une erreur indiquant « Spécialisation explicite dans une portée non-espace de noms ». Ce problème se pose car les spécialisations explicites des modèles de classe et de leurs fonctions membres doivent résider dans l'espace de noms de la déclaration du modèle.
La norme C 03 pertinente pour la spécialisation explicite (section §14.7.3/2) précise que :
"Une spécialisation explicite doit être déclarée dans l'espace de noms dont le modèle est membre, ou, pour les modèles membres, dans l'espace de noms dont la classe englobante ou le modèle de classe englobante est membre."
Cela signifie que la spécialisation explicite de la méthode Verify() doit être déclarée dans l'espace de noms où la classe CConstraint est déclarée.
De plus, selon C 03, §14.7.3/3, la spécialisation explicite des fonctions membres nécessite des spécialisation de la classe englobante. Pour résoudre ce problème, envisagez de transférer la méthode Verify() vers une fonction libre explicite et potentiellement spécialisée dans un espace de noms imbriqué :
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); } };
En encapsulant la spécialisation explicite dans un espace de noms imbriqué, les compilateurs la reconnaîtront comme appartenant à l'espace de noms du modèle, résolvant l'erreur.
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!