@MikeSeymour's answerが説明しているように、標準 (C++11、手元に C++14 のテキストがありません) に厳密に従うと、ケース (1) も実際には間違っているはずtypename
です。の左側に少なくとも 1 つの名前がある場合に使用され::
ます。
ただし、コメントで @hvd が指摘したように、CWG issue 382typename
は、グローバル名前空間修飾を含む修飾名の前に許可することが実際の意図であることを示しています。これはほとんどのコンパイラが実装しているように見えるため、この回答の残りの部分はこの考えに従います。
このように考えると、(2)が制約というわけではなく、(1)が慈悲ということになります。必要な規則 (およびその非常に独創的な表現だと思います) は、基本的に、「テンプレート パラメーターに依存する修飾名が型を表す場合は、その前に を付けなければならないtypename
」というものです。便宜上、「typename
依存型であるかどうかにかかわらず、型を限定する任意の修飾名に使用できる」に緩和されています。(1)
対照的に、修飾されていない名前は、それが型を参照しているかどうかについてあいまいになることはtypename
ありtypename
ません。
(1)この緩みは標準では明示的に述べられていませんが、いくつかの規則の組み合わせに従っています。基本的に、simple-type-specifier (型を示すもの) が許可されている場合はどこでも、文法ではtypename-specifier (接頭辞が付いた修飾名typename
) も許可されます。テンプレートの規則 (主に 14.6)typename
は、従属修飾名が型を示す場合に必要とされることのみを述べています。他のコンテキストでは何も禁止typename
されていないため、型を示す任意の修飾名で使用できます (テンプレート コンテキストの外であっても)。