功能模板无法隐藏类名?

时间:2011-04-23 18:02:30

标签: c++ name-hiding

这适用于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)可以通过在同一范围内声明的变量,数据成员,函数或枚举器的名称隐藏。如果类或枚举名称和变量,数据成员,函数或枚举器在同一作用域(按任何顺序)中声明具有相同名称,则类或枚举名称将隐藏在变量,数据成员,函数或枚举器名称可见。

1 个答案:

答案 0 :(得分:4)

那是因为规范在14.p5中说:

  

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