2011-04-23 107 views
4

这个工作在GCC和科莫:函数模板不能隐藏类名?

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

这是因为规范说在14.p5:

类模板不得具有相同的名称作为任何其他模板,类,函数,变量,枚举, 枚举,命名空间,或键入相同的范围(3.3),除了(14.5.5)中指定的。除了一个 函数模板可以被具有相同名称的(非模板)函数或其他具有相同名称的函数模板(14.8.3)重载外,在名称空间范围或类 范围内声明的模板名称应该在该范围内是独一无二的。