Перевод этой страницы?:

typename

Объявления параметров-типов в шаблонах

В списке аргументов шаблона ключевое слово 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;