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