Spécialisation explicite en dehors de la portée de l'espace de noms : une erreur dans le G non standard
La programmation de modèles C implique la spécialisation explicite des membres de la classe pour un code efficace génération. Cependant, le placement de spécialisations explicites est crucial, comme le démontre l'extrait de code suivant :
template<typename T> class CConstraint { // ... template <typename TL> void Verify(int position, int constraints[]) { } template <> void Verify<int>(int, int[]) { } };
Lorsqu'il est compilé avec g , ce code entraîne l'erreur :
Explicit specialization in non-namespace scope 'class CConstraint'
Pour comprendre Pour résoudre cette erreur, nous devons examiner le standard C, qui stipule que les spécialisations explicites doivent être déclarées dans l'espace de noms dont le modèle est membre. Dans l'exemple ci-dessus, CConstraint n'est déclaré dans aucun espace de noms, et donc la spécialisation explicite de Verify
Les compilateurs VC, cependant, ne sont pas conformes dans ce cas, autorisant des spécialisations explicites en dehors de la portée de l'espace de noms. Ce comportement n'est pas standard et ne doit pas être invoqué.
Solution :
Pour résoudre ce problème et garantir le respect de la norme C, des spécialisations explicites doivent être déclarées dans le même espace de noms que le modèle dans lequel ils se spécialisent. Voici une version corrigée du code :
namespace MyNamespace { template<typename T> class CConstraint { // ... template <typename TL> void Verify(int position, int constraints[]) { } template <> void Verify<int>(int, int[]) { } }; }
En encapsulant CConstraint dans l'espace de noms MyNamespace, nous nous assurons que ses spécialisations explicites sont également déclarées dans cet espace de noms, résolvant ainsi l'erreur de compilation.
De plus, puisque C 03 interdit la spécialisation des fonctions membres sans spécialiser explicitement la classe contenante, nous pourrions également envisager d'utiliser une approche de fonction libre, comme suggéré dans le document fourni. réponse :
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!