Maison > développement back-end > C++ > Pourquoi la spécialisation explicite d'une fonction membre en dehors de son espace de noms provoque-t-elle une erreur de compilation C ?

Pourquoi la spécialisation explicite d'une fonction membre en dehors de son espace de noms provoque-t-elle une erreur de compilation C ?

Susan Sarandon
Libérer: 2024-12-04 11:56:11
original
681 Les gens l'ont consulté

Why Does Explicit Specialization of a Member Function Outside its Namespace Cause a C   Compilation Error?

Spécialisation explicite dans une portée non-espace de noms

Dans la classe de modèle CConstraint, une spécialisation explicite de la fonction membre Verify pour int est définie en dehors de l'espace de noms de la classe. Cela provoque une erreur dans g due à une violation des standards C.

Selon C 03 §14.7.3/2, les spécialisations explicites doivent être déclarées dans l'espace de noms dont le modèle est membre ou, pour les membres templates, dans l'espace de noms dont la classe englobante ou le modèle de classe englobante est membre.

Pour résoudre ce problème, la spécialisation explicite de Verify for int doit être déclaré dans l’espace de noms de CConstraint. Ceci peut être réalisé en utilisant le code modifié suivant :

<br>template<typename T><br>class CConstraint<br>{<br>public:</p>
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">CConstraint()
{
}

virtual ~CConstraint()
{
}

template <typename TL>
void Verify(int position, int constraints[])
{       
}

template <>
void Verify<int>(int position, int constraints[])
{   
}
Copier après la connexion

};

De plus, puisque les spécialisations explicites des fonctions membres nécessitent une spécialisation explicite de la classe conteneur , une meilleure solution serait de déplacer la fonction Verify hors de la classe et dans un espace séparé espace de noms :

<br>détail de l'espace de noms<br>{</p>
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">template <typename TL>
void Verify(int position, int constraints[]) { }

template <>
void Verify<int>(int position, int constraints[]) { }
Copier après la connexion

}

modèle
classe 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
Article précédent:Pourquoi la recherche de nom non qualifié ne fonctionne-t-elle pas avec les classes de base dépendant des paramètres du modèle en C ? Article suivant:Pourquoi `tellg()` renvoie-t-il parfois une taille de fichier incorrecte ?
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
Derniers numéros
Rubriques connexes
Plus>
Recommandations populaires
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal