这适用于GCC和Comeau:
struct X {};
void X() {}
这在Comeau打破了:
struct X {};
template< typename T >
void X() {}
这打破了两个:
template< typename T >
struct X {};
template< typename T >
void X() {}
该规则由§3.3.7/ 2定义。差异只是因为函数模板不是函数吗?我无法理解海湾合作委员会的行为。
类名(9.1)或枚举名(7.2)可以通过在同一范围内声明的变量,数据成员,函数或枚举器的名称隐藏。如果类或枚举名称和变量,数据成员,函数或枚举器在同一作用域(按任何顺序)中声明具有相同名称,则类或枚举名称将隐藏在变量,数据成员,函数或枚举器名称可见。
答案 0 :(得分:4)
那是因为规范在14.p5中说:
类模板不得与任何其他模板,类,函数,变量,枚举, 枚举器,命名空间或类型在同一范围(3.3)中,除非在(14.5.5)中指定。除了a 函数模板可以由具有相同名称或其他名称的(非模板)函数重载 具有相同名称的函数模板(14.8.3),在命名空间范围或类中声明的模板名称 范围在该范围内应是唯一的。