あなたはC++ 03はC++ 11が行う一方で、テンプレート型パラメータとして内部リンケージで型を使用して許可しないことが正しいです。
ただし、匿名名前空間内の定義にはまだ外部リンクがあります。
うんは、セクション3.5 [basic.link]
は
言う名称有する名前空間の範囲(3.3.5)は、
- オブジェクト、参照、関数の名前である場合、内部結合を有します静的に宣言された関数テンプレート、または
- 明示的に
const
と宣言され、明示的に宣言されていないオブジェクトまたは参照extern
も、以前は外部リンケージがあると宣言されていませんでした。または
- 匿名組合のデータメンバー。それは内部結合を持っていない限り、それは、オブジェクトまたは参照
名は、外部結合を有します。または
- 内部リンケージがない限り、関数です。または
- 名前付きクラス(9節)、または結合目的の型定義名を持つtypedef宣言で定義された名前のないクラス(7.1.3)。または
- 名前付き列挙型(7.2)、または列挙型がリンケージ用のtypedef名を持つtypedef宣言で定義された名前のない列挙型(7.1.3)。または
- 外部リンケージを伴う列挙に属する列挙子。または内部リンクを持つ関数テンプレートでない場合(第14節)、テンプレートは
- です。名前が付けられていない名前空間内で宣言されている場合を除き、
- 名前空間(7.3)。
名前空間スコープに名前付きクラスがありますが、これには外部リンケージがあります。
とページ115の下部に脚注ISO/IECの14882:2003明確化は:無名の名前空間内のエンティティは、外部リンケージを持っているかもしれませんが
、それらが効果的に翻訳に固有の名前で修飾されていますしたがって、他の翻訳単位から決して見ることはできません。
別のバージョンをお持ちの場合は、7.3.1項を参照してください。1 [namespace.unnamed]
g ++バージョン?拡張子かもしれない –