VCでは以下のコードが通ってしまいます。
template<typename int n> struct hoge {
…
};
intはtypenameだから通っちゃうのかな?と思いましたが、そんな問題じゃないみたいです。以下のコードも通りました。
template<typename typename int n> struct hoge {
…
};
上記のようなコードがエラーにならないんですから、以下のような通常の3倍typenameを強調するコードも通っちゃいます。
template<typename typename typename T = char> struct Casval {
…
};
通常typenameを重ねて書く人はいないと思うので下の2つに関しては実害が無いと思いますが、本来typenameを書いてはいけない場所に記述してもエラーにならないため、誤ったtypename指定のされたコードを作成してしまい他のコンパイラでエラーになる可能性があります。
実際上記のコードはg++(3.4/4.3)ではエラーになりました。
また、class templateだけでなく下記のように関数templateでも多重typename指定がエラーになりません。
template<typename typename T> void func2(typename typename typename typename typename int a) {}
template<typename class T> void func3(typename typename typename typename typename int a) {}
コンパイル時に/Wallを指定しても上記の部分に関しては警告すら出ませんでした。尚、このコードの検証はVC8/9で行いました。