Avatar ·

¿Cuál es la diferencia entre typename y class al declarar parámetros de plantilla en C++?

¡Hola! Soy un desarrollador principiante de C++ y estoy tratando de entender las plantillas. Noté que al declarar parámetros de plantilla se pueden usar tanto la palabra clave `typename` como `class`. Por ejemplo: ```cpp template void foo(T t) { } template void bar(T t) { } ``` Ambas opciones se compilan y funcionan igual. Esto me confunde. ¿Por qué se necesitan dos palabras clave diferentes para el mismo propósito? ¿Hay alguna diferencia entre ellas? He oído que en algunos contextos, como al trabajar con tipos dependientes anidados, `typename` es obligatorio y `class` no funciona. ¿Es cierto? ¿O es solo una reliquia histórica? Por favor, explíquenme en detalle para que finalmente entienda cuándo usar cada una. ¡Los ejemplos de código son muy bienvenidos! Gracias de antemano. <<>>

Respuesta breve: históricamente es así, pero hay matices importantes

En realidad, en el 99% de los casos al declarar un parámetro de plantilla (template parameter), las palabras clave type