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