Avatar ·

¿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