Especialização do modelo de função de membro após erro de instanciação e ordem das funções de membro

O seguinte bit de código falha ao compilar no 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()
{
}

Mensagem de erro:specialization of ‘void Frobnigator::bar() [with T = bool]’ after instantiation. Finalmente resolvi esse problema tendo a especialização deFrobnigator::bar<bool>() apareça antesFrobnigator::foo<bool>(). Claramente, a ordem na qual os métodos aparecem é importante.

Por que, então, é a seguinte versão lite do código acima, na qual a especialização debar aparece após a versão genérica, válido?

struct Frobnigator
{
    template<typename T>
    void foo();
};

template<typename T>
void Frobnigator::bar()
{
}

template<>
void Frobnigator::bar<bool>()
{
}

int main()
{
}

questionAnswers(2)

yourAnswerToTheQuestion