Avatar ·

Em C++ ao declarar templates: class ou typename — qual a diferença e o que é melhor usar?

Olá a todos! Comecei a estudar templates em C++ e notei que em alguns exemplos é usada a palavra-chave `class`, e em outros, `typename`. Por exemplo, estas duas declarações, pelo que entendi, fazem a mesma coisa: ```cpp template void foo(T value) { } template void foo(T value) { } ``` Estou confuso. Parece que ambas as opções funcionam, mas qual delas é a correta? Existe alguma diferença entre elas, além da sintaxe? Li que `typename` apareceu depois, e alguns programadores antigos preferem `class` por hábito. Mas acho estranho usar a palavra `class` para um parâmetro que pode não ser uma classe, mas, por exemplo, `int` ou `double`. Ao mesmo tempo, `typename` soa mais universal. Além disso, ouvi dizer que há situações em que só se pode usar `typename`, e `class` não serve. Isso é verdade? Se sim, dê exemplos. E, no geral, o que é considerado um bom estilo no C++ moderno (C++11, C++14, C++17, C++20)? Qual opção é recomendada?