c++类型定义和枚举

C++ typedefs and enums

本文关键字:枚举 定义 类型 c++      更新时间:2023-10-16

我试图将一个名称空间中的枚举的别名引入另一个名称空间。虽然我可以声明别名类型的变量,但编译器(gcc 4.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;
}

编译错误是

测试。cc:12:错误:'One'不是'B'的成员。

虽然在Bb中可以访问枚举类型,但这些值不是,必须显式地引入:

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

我不认为有一种方法来把它们都带进来没有单独的using语句,除非你做using namespace 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中引入的,GCC 4.1.2不支持。如果可以的话,我强烈建议你升级。最新的稳定版本是4.8.1

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

enum struct a { /* .... */ };  // the class keyword may also be used
其效果是使枚举数(常量)的作用域在枚举类型本身内,即:例如,访问a常量的表示法变成了a::One。因为它们现在属于enum类型,而不是名称空间,所以您可以轻松地将它们与enum一起导入到另一个带有类型定义的名称空间中。但是请注意,限定范围的枚举值可能不会像普通枚举那样容易地被提升为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;
}