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
Susan Sarandonoriginal
2024-12-04 11:56:11701parcourir

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>
<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[])
{   
}

};

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>
<pre class="brush:php;toolbar:false">template <typename TL>
void Verify(int position, int constraints[]) { }

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

}

modèle
classe 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!

Déclaration:
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