Специализация шаблона функции-члена после ошибки создания экземпляра и порядок функций-членов

Следующий бит кода не скомпилируется на 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()
{
}

Сообщение об ошибке:specialization of ‘void Frobnigator::bar() [with T = bool]’ after instantiation, Я наконец решил эту проблему, имея специализациюFrobnigator::bar<bool>() появляются раньшеFrobnigator::foo<bool>(), Очевидно, порядок, в котором появляются методы, имеет значение.

Почему тогда следующая облегченная версия приведенного выше кода, в которой специализацияbar появляется после общей версии, действительной?

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

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

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

int main()
{
}

Ответы на вопрос(2)

Ваш ответ на вопрос