¿Cuál es la diferencia entre typedef y using en C++? ¿Cuándo usar cada uno?
¡Hola, colegas! Recientemente comencé a estudiar C++ y me topé con dos formas de crear alias de tipos: el viejo y querido `typedef` y el nuevo `using` (o declaración de alias), que apareció en C++11.
Entiendo que ambos hacen aparentemente lo mismo. Por ejemplo, puedo escribir:
```cpp
typedef unsigned long long ULL;
using ULL = unsigned long long;
```
Y parece que no hay ninguna diferencia. Pero he oído que `using` es más moderno y se recomienda en código contemporáneo. ¿Por qué? ¿Cuál es la diferencia real? ¿Hay casos donde `typedef` no funciona, pero `using` sí? ¿O al revés?
Me interesan especialmente los casos complejos: trabajo con punteros a funciones, con templates, con tipos anidados. Intenté hacer un alias para una clase template con `typedef` y no me funcionó. Quizás estoy haciendo algo mal.
Aquí hay un ejemplo que me confunde:
```cpp
// ¿Esto funciona?
template
typedef std::vector Vec; // ¡Error de compilación!
// ¿Y esto?
template
using Vec = std::vector