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

时间:2018-07-19 22:14:48

标签: c++ enums namespaces typedef

当我这样定义枚举时:

    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'

这是为什么?

2 个答案:

答案 0 :(得分:0)

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

解决方案只是坚持最重要的示例并删除static

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

(由于enum class不可用)。

答案 1 :(得分:0)

首先,除了在枚举定义中错误地放置static之外,

没什么问题
typedef ns::Foo::Foo Foo;

,它可以在任何符合标准的C ++编译器中完美编译。您如何最终以“ enum'ns :: Foo :: Foo'没有成员'Foo'” 结束。

第二,虽然经典的无作用域枚举确实将其成员常量的名称引入了封闭的名称空间,但从C ++ 11开始,如果愿意,您仍然可以使用作用域名称将“常量”引用到此类枚举中。例如,这完全有效

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

等效于

int i = ns::Foo::VAL1;