Spécialisation du modèle de fonction membre après l'erreur d'instanciation et l'ordre des fonctions membres
Le code suivant ne compile sur gcc 4.5.3
struct Frobnigator
{
template<typename T>
void foo();
template<typename T>
void bar();
};
template<typename T>
void Frobnigator::bar()
{
}
template<typename T>
void Frobnigator::foo()
{
bar<T>();
}
template<> //error
void Frobnigator::foo<bool>()
{
bar<bool>();
}
template<>
void Frobnigator::bar<bool>()
{
}
int main()
{
}
Message d'erreur: specialization of ‘void Frobnigator::bar() [with T = bool]’ after instantiation
. J'ai enfin résolu ce problème en ayant la spécialisation de Frobnigator::bar<bool>()
comparaître devant Frobnigator::foo<bool>()
. Clairement l'ordre dans lequel les méthodes apparaissent question.
Pourquoi, alors, est la suivante lite version du code ci-dessus, dans lequel la spécialisation de bar
apparaît après la version générique, valable ?
struct Frobnigator
{
template<typename T>
void foo();
};
template<typename T>
void Frobnigator::bar()
{
}
template<>
void Frobnigator::bar<bool>()
{
}
int main()
{
}
source d'informationauteur Olumide | 2014-01-14
Vous devez vous connecter pour publier un commentaire.
Votre premier code n'est pas correct par la norme.
n3376 l'article 14.7.3/6
Dans votre cas implicite de l'instanciation de
bar
fonction de typebool
est tenu par son utilisation dansfoo<bool>
avant de spécialisation explicite déclaration.En effet; comme c'est généralement le cas en C++, vous ne pouvez pas utiliser quelque chose avant qu'il soit déclaré, et cela s'applique à l'explicite modèle de spécialisation, ainsi que la plupart des autres choses.
À l'aide de
bar<bool>
(en appelant à partir defoo<bool>
) sans qu'une déclaration explicite de la spécialisation des causes qui spécialisation pour être instancié à partir du modèle générique, si elle n'a pas déjà été. Vous aurez besoin d'au moins une déclaration explicite de spécialisation pour l'en empêcher.Le deuxième exemple se distingue pas par l'instanciation de
foo<bool>
à tous. Le problème n'est pas que la spécialisation est déclaré après le modèle générique (qui doit être le cas), mais qu'il est déclaré, après que la spécialisation a déjà été instancié.