如何在C++中将枚举导入不同的命名空间?

Jos*_*vin 28 c++ enums typedef namespaces language-lawyer

我在命名空间中有一个枚举,我想使用它,就像它在不同的命名空间中一样.直观地说,我认为我可以使用'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;
}
Run Code Online (Sandbox Code Playgroud)

问题是枚举本身是导入的,但没有导入.不幸的是,我无法将原始枚举更改为包含在额外的虚拟命名空间或类中,而不会破坏许多其他现有代码.我能想到的最好的解决方案是手动重现枚举:

namespace buzz
{
enum bar
{
    A = foo::A
};
}
Run Code Online (Sandbox Code Playgroud)

但它违反了DRY原则.有没有更好的办法?

Mar*_*k B 25

将现有命名空间包装在嵌套命名空间中,然后在原始命名空间中"使用".

namespace foo
{
    namespace bar_wrapper {
        enum bar {
            A
        };
    }
    using namespace bar_wrapper;
}

namespace buzz
{
    using namespace foo::bar_wrapper;
}
Run Code Online (Sandbox Code Playgroud)


小智 8

虽然我最喜欢Mark B的方法,因为它不会破坏现有代码,您也可以执行以下操作:

namespace foo {
 enum bar {
  A, B [..]
 };
}

namespace buzz {
 using foo::bar;
 using foo::A;
 using foo::B;
 [..]
}


Abh*_*hay 6

这里的问题是using声明只引入枚举的名称,而不是其值的名称. 枚举不是范围,也不带有普查员的姓名.我认为不可能自己导入枚举值.尝试将enum包装在struct/namespace中并使用它.

  • 侧注释:在C++ 0x中,枚举是*种类的*上下文,您可以通过它来访问枚举值.`enum A {a,b}; A :: a;`将是有效的代码,一旦到位,简单的`using`或`typedef`方法将起作用:`namespace A {enum X {a,b}; } namespace B {using A :: X; } int main(){B :: X x = B :: X :: a; }` (3认同)