typename
и typedef
- это совершенно разные вещи.
typedef
- ключевое слово, используемое для введения псевдонима типа ( введите def inition). В последних стандартах вы также можете использовать using
для этого. Итак:
typedef int MyThing;
// or
using MyThing = int;
typename
- это ключевое слово, которое говорит: «следующая вещь - это тип». Он используется при работе с шаблонами в некоторых ситуациях, как в объявлениях шаблонов (например, template <typename T> void foo() { /*..*/ }
), так и , чтобы помочь анализатору в некоторых ситуациях . В приведенном вами примере это допустимо, но избыточно .
Эти две вещи совершенно разные и, следовательно, не взаимозаменяемы.