Spezialisierung der Elementfunktionsvorlage nach Instanziierungsfehler und Reihenfolge der Elementfunktionen

Das folgende Codebit kann unter gcc 4.5.3 nicht kompiliert werden

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()
{
}

Fehlermeldung:specialization of ‘void Frobnigator::bar() [with T = bool]’ after instantiation. Ich habe dieses Problem endlich durch die Spezialisierung von gelöstFrobnigator::bar<bool>() erscheinen vorFrobnigator::foo<bool>(). Klar ist die Reihenfolge, in der die Methoden erscheinen, von Bedeutung.

Warum ist dann die folgende Lite-Version des obigen Codes, in der die Spezialisierung vonbar erscheint nach der generischen Version, gültig?

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

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

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

int main()
{
}

Antworten auf die Frage(2)

Ihre Antwort auf die Frage