4

これは GCC と Comeau で動作します:

struct X {};

void X() {}

これはコモーで壊れます:

struct X {};

template< typename T >
void X() {}

これは両方を壊します:

template< typename T >
struct X {};

template< typename T >
void X() {}

ルールは §3.3.7/2 で定義されています。関数テンプレートが関数ではないという理由だけで不一致ですか? GCC の動作が理解できません。

クラス名 (9.1) または列挙名 (7.2) は、同じスコープで宣言された変数、データ メンバー、関数、または列挙子の名前によって非表示にすることができます。クラスまたは列挙名と、変数、データ メンバー、関数、または列挙子が同じスコープで (任意の順序で) 同じ名前で宣言されている場合、クラスまたは列挙名は、変数、データ メンバー、関数、または列挙子名が表示されます。

4

1 に答える 1

4

これは、仕様が 14.p5 で次のように述べているためです。

クラス テンプレートは、(14.5.5) で指定されている場合を除き、同じスコープ (3.3) 内の他のテンプレート、クラス、関数、変数、列挙、列挙子、名前空間、または型と同じ名前を持ってはなりません。関数テンプレートは、同じ名前の (非テンプレート) 関数または同じ名前の他の関数テンプレート (14.8.3) によってオーバーロードできることを除いて、名前空間スコープまたはクラス スコープで宣言されたテンプレート名は、その範囲。

于 2011-04-23T21:17:00.583 に答える