C++ C++;typedefs和enum

C++ C++;typedefs和enum,c++,C++,我试图将一个名称空间中的枚举的别名引入另一个名称空间。虽然我可以声明一个别名类型的变量,但编译器(GCC4.1.2)不会识别任何枚举值 namespace A { enum a { One = 1, Two = 2 }; } namespace B { typedef enum A::a b; }; A::a a_value = A::One; // Pretty standard B::b b_value = B::One; // Does not work B::

我试图将一个名称空间中的枚举的别名引入另一个名称空间。虽然我可以声明一个别名类型的变量,但编译器(GCC4.1.2)不会识别任何枚举值

namespace A
{
    enum a { One = 1, Two = 2 };
}

namespace B
{
    typedef enum A::a b;
};

A::a a_value = A::One;   // Pretty standard
B::b b_value = B::One;   // Does not work
B::b c_value = A::One;   // Clearly B is a typedef for A

int main (int argc, const char *argv[])
{
   return 0;
}
编译器错误为


test.cc:12:错误:“One”不是“B”的成员。

当枚举类型可以在
B
中通过
B
访问时,值不是且必须显式引入:

namespace B {
    typedef A::a b;
    using A::One;
}
我不认为有一种方法可以在不使用单独的
语句的情况下将它们全部引入,除非您使用
名称空间a
或将枚举放入内联命名空间中,并为此使用语句。如果您担心引入所有
A
,并且仍然希望将枚举值与
A::value
一起使用,则后者可能更可取。下面是一个例子:

namespace A
{
    inline namespace en {
        enum a { One = 1, Two = 2 };
    }

    enum c {Three};
}

namespace B
{
    using namespace A::en;
    typedef A::a b;
}

A::a a_value = A::One; // works; things in en are still visible in A
B::b b_value = B::One; // works; en was brought into B
B::b c_value = A::One; // works
A::c meh = B::Three; //fails; only en was brought into B

请注意,内联名称空间是在C++11中引入的,GCC4.1.2不支持它。如果可以,我强烈建议升级。最新的稳定版本是4.8.1。

C++11之前的C++没有为该问题提供任何(简单的)解决方案。在C++11中,可以使用以下语法声明枚举作用域:

enum struct a { /* .... */ };  // the class keyword may also be used
其效果是使枚举数(常量)在枚举类型本身内起作用,例如,访问
a
常量的表示法变为
a::One
。因为它们现在属于枚举类型,而不是名称空间,所以您可以轻松地将它们与枚举一起导入另一个具有typedef的名称空间。但是请注意,作用域枚举值可能不像常规枚举那样容易升级为
int

namespace A {
    enum class a { One = 1, Two = 2 };
}

namespace B {
    typedef  A::a b;
}

A::a a_value = A::One;
B::b b_value = B::One;  // Now this works
B::b c_value = A::One;   // Clearly B is still a typedef for A

int main (int argc, const char *argv[]) {
   return 0;
}

尝试使用A::A作为b;在名称空间B内(或类似的内容)。(这就是为什么这是一个注释,而不是答案。)这是因为
One
不是
B
的成员……这是一个非常古老的编译器。你真的需要使用这个版本吗?