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