29

我在命名空间中有一个枚举,我想像在不同的命名空间中一样使用它。直觉上,我认为我可以使用“使用”或“类型定义”来完成此操作,但实际上都不起作用。证明它的代码片段,在 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 原则。有没有更好的办法?

4

5 回答 5

27

将现有命名空间包装在嵌套命名空间中,然后在原始命名空间中“使用”它。

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

namespace buzz
{
    using namespace foo::bar_wrapper;
}
于 2010-07-20T19:12:39.370 回答
10

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

命名空间 foo {
 枚举栏 {
  甲,乙 [..]
 };
}

命名空间嗡嗡声{
 使用 foo::bar;
 使用 foo::A;
 使用 foo::B;
 [..]
}
于 2010-07-20T19:32:00.903 回答
6

这里的问题是 using 声明仅引入枚举的名称,而不是其值的名称。 枚举不是作用域,也不带有枚举数的名称。我认为不可能自己导入枚举值。尝试将枚举包装在结构/命名空间中并使用它。

于 2010-07-20T19:02:25.473 回答
4

从 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 。

于 2018-03-01T09:02:26.523 回答
1

如果您确实需要这样做,请尝试using namespace foo;代替using foo::bar;. 但是,将枚举封装在一个类或另一个命名空间中是一个更好的主意。

于 2010-07-20T19:04:29.950 回答