当我这样定义枚举时:
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'
这是为什么?
答案 0 :(得分:0)
enum
不会创建自己的名称空间,因此Intellisense无法区分ns::Foo
和ns::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;