Se não instanciou o template não tem nada de errado
2024-07-03 computer ccpp blogConsidere este código:
struct Adapter1 { static const int Size = 10; };
struct Adapter2 { static const int NoSize = 10; };
template<typename Adapter> struct Size { int size() { return Adapter::Size; } };
int main() { }
Vai quebrar em que linha? Resposta: nenhuma. Isso porque não há uma instanciação de nenhum template Size e o compilador não tem código algum para validar. Tudo que ele sabe é que, uma vez instanciado Size seu tipo Adapter precisa ter um membro chamado Size compatível com um inteiro para que o método size() seja um código válido.
int main()
{
Size<Adapter1> a1;
int sz1 = a1.size();
Size<Adapter2> a2;
int sz2 = a2.size(); // error C2039: 'Size': is not a member of 'Adapter2'
}
Agora, sim. O código existe; não é mais apenas um "gabarito", termo que foi a tradução de template na primeira edição de A Linguagem de Programação C++ (agora até que faz sentido esse termo). E enquanto Size<Adapter1> gera um código 100% correto Size<Adapter2> não, pois seu único membro não se chama Size.