c++ - typedef'ing enum 不会使 enum-values 可见

标签 c++ enums

我有一个类,其中有一个枚举,定义如下:

class X
   {
   public:
      enum Direction {DIR_LEFT, DIR_RIGHT};
   };

现在我希望在另一个类中重用这个枚举,如下所示:

class Y
   {
   public:
      typedef X::Direction Direction;
   };

正如预期的那样,使用 Y::Direction 可以正常工作,例如:

void myFunction (Y::Direction dir)
{
}

但枚举中的值似乎没有与 typedef 一起“复制”。如果我编写以下内容,则会出现编译错误:

myFunction (Y::DIR_LEFT);

相反,我不得不再次引用枚举的原始位置,像这样:

myFunction (X::DIR_LEFT);

这违背了我定义枚举的目的。

我看到的唯一解决方案是将枚举移出 X 类,并将其放入另一个类(例如 MyEnums),以便 X 和 Y 可以重用它(尽管它们仍应使用 MyEnums::DIR_LEFT 和 MyEnums::DIR_RIGHT),但至少代码不再依赖于类 X。

为什么枚举值本身没有通过 typedef 暴露?

还有其他模式可以管理不同类中的枚举吗?

最佳答案

不幸的是,尽管 C++0x 正在改进一些东西,但 C++ 并没有引入带有 enum 的新作用域。

实际上,这意味着您不能 typedef 枚举并获取枚举值。

可以做的是使用一个嵌套结构,它具有你想要的枚举名称和 typedef THAT。

class X
{
public:
    struct Direction { enum EnumType {LEFT, RIGHT}; };
};

class Y
{
public:
    typedef X::Direction Direction;
};

现在您可以: myFunction (Y::Direction::LEFT);

嵌套结构的目的是创建一个“假”范围来保存枚举名称及其值。

关于c++ - typedef'ing enum 不会使 enum-values 可见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5315716/

相关文章:

c++ - 如何扩展库类的功能?

java - 在 Java 中是否有与 C++ 中的 size_t 等效的东西?

android - 属性集,通过名称获取枚举

c++ - 如何静态断言模板枚举类型? (C++11)

javascript - 在 JavaScript 中创建枚举

c++ - opencv中的Conv2

c++ - 在 decltype 中使用命名空间

c++ - 使用 g++ 静态链接 matio 库

带标签的类内的 java 枚举

ruby-on-rails - 具有枚举和关联的工厂女孩