函数模板不能隐藏类名

function template cannot hide class name?

本文关键字:隐藏 不能 函数模板      更新时间:2023-10-16

这适用于GCC和comau:

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定义。这种差异仅仅是因为函数模板不是函数吗?我不能理解GCC的行为。

类名(9.1)或枚举名(7.2)可以通过在同一作用域中声明的变量名、数据成员名、函数名或枚举数名来隐藏。如果类或枚举名与变量、数据成员、函数或枚举数在同一作用域中以相同的名称声明(以任何顺序),则类或枚举名将隐藏在变量、数据成员、函数或枚举数名可见的地方。

这是因为规范中说:

类模板不能与其他模板、类、函数、变量、枚举、同一作用域(3.3)中的枚举数、命名空间或类型,(14.5.5)中指定的除外。除了a函数模板可以被同名的(非模板)函数重载,也可以被其他函数重载具有相同名称的函数模板(14.8.3),在命名空间作用域或类中声明的模板名称范围在该范围内必须是唯一的。