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 中说:

类模板不得与同一范围 (3.3) 中的任何其他模板、类、函数、变量、枚举、枚举器、命名空间或类型具有相同的名称,除非在 (14.5.5) 中指定。除了函数模板可以被(非模板)同名函数或其他同名函数模板(14.8.3)重载外,在命名空间范围或类范围内声明的模板名称在那个范围。

于 2011-04-23T21:17:00.583 回答