当命名空间和该命名空间中的枚举共享名称时,为什么 C++ typedef 会抛出错误?

Why does C++ typedef throw an error when a namespace and an enum within that namespace share a name?

当我有一个这样定义的枚举时:

    namespace ns
    {
        namespace Bar
        {
            static enum Foo {
                VAL1,
                VAL2,
                VAL3
            };
        }
   }

我可以使用:

typedef ns::Bar::Foo Foo;

简化我代码中其他地方的参数类型。但是,当我将定义更改为:

namespace ns
{
    namespace Foo
    {
        static enum Foo {
            VAL1,
            VAL2,
            VAL3
        };
    }
}

并尝试使用:

typedef ns::Foo::Foo Foo;

我得到:

Error: enum 'ns::Foo::Foo' has no member 'Foo'

这是为什么?

enum 不会创建自己的命名空间,因此 Intellisense 无法区分 ns::Foons::Foo::Foo

解决方案就是坚持上面的例子并删除 static:

namespace ns
{
    namespace Bar
    {
        enum Foo {
            VAL1,
            VAL2,
            VAL3
        };
    }
}

(因为 enum class 不可用)。

首先,除了枚举定义中static错位外,

没有任何问题
typedef ns::Foo::Foo Foo;

它在任何符合标准的 C++ 编译器中都能完美编译。您如何设法以 "enum 'ns::Foo::Foo' has no member 'Foo'" 结束尚不清楚。

其次,虽然经典的无范围枚举确实将其成员常量的名称引入了封闭的命名空间,但从 C++11 开始,您仍然可以使用范围名称来引用 "into" 此类枚举,如果你这么喜欢。例如,这是完全有效的

int i = ns::Foo::Foo::VAL1;

相当于

int i = ns::Foo::VAL1;