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

标签 c++ enums namespaces typedef language-lawyer

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

最佳答案

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

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

namespace buzz
{
    using namespace foo::bar_wrapper;
}

关于c++ - 如何将枚举导入 C++ 中的不同命名空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3293279/

相关文章:

c++ - C++中类声明的范围是什么?

c# - 设置由字符串给出的枚举类型的属性

c++ - 如何在开关中将一个枚举值标记为不适当的大小写

java - 如何将枚举与命令行参数一起使用?

javascript - 如何在不覆盖另一个同名对象的情况下创建一个空的命名空间对象?

c# - 字符串文字和字 rune 字可以连接吗?

c++ - 使用 Boost 线程监控对象队列

c++ - Leptonica 与 Xcode 框架冲突

php - 为什么 Doctrine 2.2 使用 -namespace- 和 -use- 而没有任何包含或要求语句?

php - 如何为外部类 (FPDF) 设置正确的命名空间