В списке аргументов шаблона ключевое слово typename может использоваться наравне с ключевым словом class, указывая параметр-тип. Хотя разницы никакой, для улучшения читабельности исходного кода, Александреску рекомендует использовать class, когда ожидается что фактическим параметром шаблона будет класс или структура, а typename для прочих видов типов.
Основное назначение typename - указать компилятору что выражение вида T::x - тип, а не переменная.
struct Foo { typedef int Type; }; template<class T> struct Bar { typedef typename T::Type BarType; // В typedef void baz() { typename T::Type instance; // В объявлении } }; typedef Bar<Foo> FooBar;