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