函数模板不能隐藏类名?
这在 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 定义。差异仅仅是因为函数模板不是函数吗?我无法理解 GCC 的行为。
类名 (9.1) 或枚举名称 (7.2) 可以通过在同一作用域中声明的变量、数据成员、函数或枚举器的名称来隐藏。如果类或枚举名称和变量、数据成员、函数或枚举器在同一范围内(以任何顺序)以相同名称声明,则无论变量、数据成员、函数或枚举器在何处,类或枚举名称都会隐藏。枚举器名称可见。
This works in GCC and Comeau:
struct X {};
void X() {}
This breaks in Comeau:
struct X {};
template< typename T >
void X() {}
This breaks both:
template< typename T >
struct X {};
template< typename T >
void X() {}
The rule is defined by §3.3.7/2. Is the discrepancy simply because a function template is not a function? I can't make sense of GCC's behavior.
A class name (9.1) or enumeration name (7.2) can be hidden by the name of a variable, data member, function, or enumerator declared in the same scope. If a class or enumeration name and a variable, data member, function, or enumerator are declared in the same scope (in any order) with the same name, the class or enumeration name is hidden wherever the variable, data member, function, or enumerator name is visible.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
那是因为规范在 14.p5 中说:
That's because the spec says in 14.p5: