¿Dónde y por qué se necesitan las palabras clave template y typename en C++?
¡Hola, colegas! Llevo varios meses escribiendo en C++, pero las plantillas todavía me causan dolor de cabeza. Especialmente me confunden las palabras clave `template` y `typename`. Entiendo que están relacionadas de alguna manera con los nombres dependientes (dependent names), pero en la práctica constantemente obtengo errores de compilación.
Aquí hay un ejemplo concreto que me rompió. Supongamos que tengo una clase de contenedor plantilla, y quiero escribir una función que imprima los elementos de un tipo iterador anidado:
```cpp
#include
#include
template
void printFirst(const T& container) {
T::const_iterator it = container.begin(); // ¡Error!
std::cout << *it << std::endl;
}
int main() {
std::vector vec = {1, 2, 3};
printFirst(vec);
return 0;
}
```
El compilador (GCC) muestra: `error: need 'typename' before 'T::const_iterator' because 'T' is a dependent scope`. Pongo `typename` — el error desaparece. Pero cuando intento hacer algo similar con una plantilla anidada,