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