函数模板不能隐藏类名?

发布于 2024-11-03 04:36:34 字数 543 浏览 3 评论 0原文

这在 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

像极了他 2024-11-10 04:36:34

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

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

That's because the spec says in 14.p5:

A class template shall not have the same name as any other template, class, function, variable, enumeration,
enumerator, namespace, or type in the same scope (3.3), except as specified in (14.5.5). Except that a
function template can be overloaded either by (non-template) functions with the same name or by other
function templates with the same name (14.8.3), a template name declared in namespace scope or in class
scope shall be unique in that scope.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文