"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Pourquoi la spécialisation explicite des membres de la classe C ++ échoue-t-elle en dehors de l'espace de noms?

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

Publié le 2025-04-18
Parcourir:515

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 la programmation de modèle G non standard implique la spécialisation explicite des membres de la classe pour une génération de code efficace. Cependant, le placement des spécialisations explicites est crucial, comme le montre l'extrait de code suivant:

modèle classe de classe { // ... modèle void vérifier (position int, contraintes int []) { } modèle void Verify (int, int []) { } };

Lorsqu'elle est compilée avec G, ce code entraîne l'erreur:
template
class CConstraint
{
    // ...

    template 
    void Verify(int position, int constraints[])
    {
    }

    template 
    void Verify(int, int[])
    {
    }
};
Explicit Specialization in non-Namespace Scope 'class Cconstraint'

pour comprendre cette erreur, nous devons examiner la norme C, qui dictates qui dictentent un membre explicite. Dans l'exemple ci-dessus, CConstraint n'est déclaré dans aucun espace de noms, et donc la spécialisation explicite de Verify est invalide.
template
class CConstraint
{
    // ...

    template 
    void Verify(int position, int constraints[])
    {
    }

    template 
    void Verify(int, int[])
    {
    }
};
compilateurs VC, cependant, sont non conformes dans ce cas, permettant des spécialisations explicites à l'extérieur de l'espace de noms de noms. Ce comportement est non standard et ne doit pas être utilisé. Voici une version corrigée du code:

Espace de noms MyNamespace { modèle classe de classe { // ... modèle void vérifier (position int, contraintes int []) { } modèle void Verify (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ésolution de l'erreur de compilation. Réponse:

Détail de l'espace de noms { modèle void vérifie (int, int []) {} modèle void vérifie (int, int []) {} } modèle class cConstraint { // ... modèle void vérifie (position int, int contraintes []) { Détail :: Vérifier (position, contraintes); } };

Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3