c++类型定义和枚举
C++ typedefs and enums
我试图将一个名称空间中的枚举的别名引入另一个名称空间。虽然我可以声明别名类型的变量,但编译器(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'的成员。
虽然在B
到b
中可以访问枚举类型,但这些值不是,必须显式地引入:
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;
}
相关文章:
- 如何正确实现和访问运算符的各种自定义枚举器
- 枚举类'classname'的多重定义
- 强枚举类型定义:Clang Bug 还是 C++11 标准不确定性?
- C++:如何在声明枚举类的模板类主体之外定义枚举类?
- C2365 重新定义 VS2019 升级后,以前的定义是外部标头 + lib 的"枚举器"
- 如何在 std::p air 中使用 System::Guid 和自定义枚举?
- 如何理解c++中在命名空间内部定义的枚举类型enum
- 当在基类中定义枚举时,qml中的Q_ENUM未定义值
- 在模板类内部定义的枚举上的嵌套类的部分专用化
- 枚举的复合赋值运算符真的应该根据其关联的算术运算符来定义吗?
- 如何检查类中定义的枚举类型变量是否被分配给?
- 在 FlatBuffer 中使用自定义枚举
- C++:使用后类中的枚举定义
- 不接受C++枚举定义
- 方便地为枚举定义按位运算符,以创建位标志
- 为嵌套在类中的枚举定义运算符
- 为什么在c++枚举定义中需要typedef
- 在类中添加枚举定义会破坏其二进制向后兼容性吗?
- 扩展枚举定义
- 用枚举定义成员函数不需要Include