我在命名空间中有一个枚举,我想使用它,就像它在不同的命名空间中一样。直观地说,我认为我可以使用'using'或'typedef'来实现这一目标,但实际上都没有。用于证明它的代码片段,在GCC和Sun CC上测试:
namespace foo
{
enum bar {
A
};
}
namespace buzz
{
// Which of these two methods I use doesn't matter,
// the results are the same.
using foo::bar;
//typedef foo::bar bar;
}
int main()
{
foo::bar f; // works
foo::bar g = foo::A; // works
buzz::bar x; // works
//buzz::bar y = buzz::A; // doesn't work
buzz::bar z = foo::A;
}
问题是枚举本身是导入的,但没有导入。不幸的是,我无法将原始枚举更改为包含在额外的虚拟命名空间或类中,而不会破坏许多其他现有代码。我能想到的最佳解决方案是手动重现枚举:
namespace buzz
{
enum bar
{
A = foo::A
};
}
但它违反了DRY principle。还有更好的方法吗?
答案 0 :(得分:24)
将现有命名空间包装在嵌套命名空间中,然后在原始命名空间中“使用”。
namespace foo
{
namespace bar_wrapper {
enum bar {
A
};
}
using namespace bar_wrapper;
}
namespace buzz
{
using namespace foo::bar_wrapper;
}
答案 1 :(得分:8)
虽然我最喜欢Mark B的方法,因为它不会破坏现有代码,您也可以执行以下操作:
namespace foo { enum bar { A, B [..] }; } namespace buzz { using foo::bar; using foo::A; using foo::B; [..] }
答案 2 :(得分:6)
这里的问题是using声明只引入枚举的名称,而不是其值的名称。 Enum不是范围,也不带有名称 枚举即可。我认为不可能自己导入枚举值。尝试将enum包装在struct / namespace中并使用它。
答案 3 :(得分:2)
从C ++ 11开始,您可以使用enum class
。导入enum class
导入其所有值:
namespace foo
{
enum class bar {
A
};
}
namespace buzz
{
using foo::bar;
}
int main()
{
foo::bar f;
foo::bar g = foo::bar::A;
buzz::bar x;
buzz::bar y = buzz::bar::A;
buzz::bar z = foo::bar::A;
}
上面的代码成功编译:http://coliru.stacked-crooked.com/a/2119348acb75d270。
答案 4 :(得分:1)
如果您确实需要这样做,请尝试using namespace foo;
而不是using foo::bar;
。但是,将枚举封装在类或另一个命名空间中是一个更好的主意。