根据此链接
A point from C++0x draft : n3290
这个程序是否正确?
EX:
namespace X {};
enum Foo
{
X = 0, #1
Y,
Z = X // X refers to the enum, not the type
};
执行此程序时遇到错误,如//#1'X'重新声明为不同类型的符号
但是在上面的语句链接中...包含enum-specifier的命名空间范围。 ......等等。
请澄清我的疑问。
否则请任何人给我一个例子,用命名空间
证明上述陈述(在链接中)答案 0 :(得分:1)
原始问题有一个struct X
而不是namespace X
。命名空间名称在此范围内是可见的,因此枚举名称“泄漏”到周围的命名空间中也是如此。这造成了冲突。
在C中(因此也在C ++中)struct / class / union的名称位于单独的“tag namespace”(具有不同含义的C术语)中,这允许我们使用相同的名称声明另一个项目。相同的范围:
答案 1 :(得分:0)
该计划是非法的。 enum
不会引入单独的范围
(除非你使用C ++ 11 和添加class
),两者都是
名称空间X
和枚举常量X
属于同一范围。
只有两种情况可以定义相同的名称
曾经在同一范围内:重载函数和一个类名。该
类名的特殊情况纯粹是为了C兼容性,所以
C API具有以下功能:
struct stat { ... };
int stat(const char* path, struct stat* buf);
不会破裂。如果同时存在类名和其他名称,则 其他名称具有优先权,除非前面有类关键字。