Se não instanciou o template não tem nada de errado

2024-07-03 computer ccpp blog

Considere 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.

[comment] [Mock de Timer em Moq]