C++ C++;typedefs和enum
我试图将一个名称空间中的枚举的别名引入另一个名称空间。虽然我可以声明一个别名类型的变量,但编译器(GCC4.1.2)不会识别任何枚举值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::
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
的成员……这是一个非常古老的编译器。你真的需要使用这个版本吗?