Maison > développement back-end > C++ > Pourquoi la spécialisation explicite des membres de classe échoue-t-elle en dehors d'un espace de noms en C ?

Pourquoi la spécialisation explicite des membres de classe échoue-t-elle en dehors d'un espace de noms en C ?

Susan Sarandon
Libérer: 2024-12-06 04:49:21
original
233 Les gens l'ont consulté

Why Does Explicit Specialization of Class Members Fail Outside a Namespace in C  ?

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[])
    {
    }
};
Copier après la connexion

Lorsqu'il est compilé avec g , ce code entraîne l'erreur :

Explicit specialization in non-namespace scope 'class CConstraint'
Copier après la connexion

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 n'est pas valide.

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[])
        {
        }
    };
}
Copier après la connexion

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