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