Specjalizacja szablonu funkcji składowej po wystąpieniu błędu instancji i kolejności funkcji składowych

Następujący bit kodu nie kompiluje się na 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()
{
}

Komunikat o błędzie:specialization of ‘void Frobnigator::bar() [with T = bool]’ after instantiation. W końcu rozwiązałem ten problem dzięki specjalizacjiFrobnigator::bar<bool>() pojawiać się wcześniejFrobnigator::foo<bool>(). Oczywiście kolejność, w jakiej metody wydają się mieć znaczenie.

Dlaczego więc następująca wersja lite powyższego kodu, w której specjalizacjabar pojawia się po wersji ogólnej, ważne?

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

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

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

int main()
{
}

questionAnswers(2)

yourAnswerToTheQuestion