Avatar ·

Qual é a diferença entre typename e class ao declarar parâmetros de template em C++?

Olá! Sou um desenvolvedor C++ iniciante e estou tentando entender templates. Notei que ao declarar parâmetros de template, posso usar tanto a keyword `typename` quanto `class`. Por exemplo: ```cpp template void foo(T t) { } template void bar(T t) { } ``` Ambas as opções compilam e funcionam da mesma forma. Isso me confunde. Por que existem duas keywords diferentes para o mesmo propósito? Existe alguma diferença entre elas? Ouvi dizer que em alguns contextos, como ao trabalhar com tipos dependentes aninhados, `typename` é obrigatório e `class` não funciona. Isso é verdade? Ou é apenas um resquício histórico? Explique, por favor, em detalhes, para que eu finalmente entenda quando usar cada uma. Exemplos de código são muito bem-vindos. Desde já, obrigado! <<>>

Resposta curta: historicamente foi assim, mas há nuances importantes

Na verdade, em 99% dos casos ao declarar um parâmetro de template, as keywords type