templateの引数リストのtypenameは型パラメータのclassと置き換えて使用することができます。コンパイラから見ると、どちらが使用されても違いはありませんが、Alexandrescu氏はテンプレート引数としてclassかstructを期待しているときはclassを使い、typenameはそれ以外の型のときに使用するのを推奨しています。このキーワードは単純にソースコードの読みやすさを向上させるためのものです。
typenameキーワードは依存名を表すのにも使用します。テンプレート定義の中で型を表していることを明示します。
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;
関連トピック: class, template