4

我在标题中的一个类中有枚举定义:

namespace A {

class B {
 public:
  enum Value {
    VALUE1 = 1,
    VALUE2 = 2,
  };
};

}

我想在没有前缀的源文件中使用它的值,如下所示:

#include "header"

int main() {
  someFn(VALUE1);

  return 0;
}

我试过using A::B::Value;但clang给出了一个错误:

using 声明不能引用类成员


即使我将枚举移到班级之外:

namespace A {

enum Value {
  VALUE1 = 1,
  VALUE2 = 2,
};    

}

并且做using A::Value;,错误消失了,但编译器抱怨VALUE1

使用未声明的标识符“VALUE1”

如果枚举是在其他地方定义的,有没有办法使用没有任何前缀的枚举值?- 使用#defines 是不可能的。

如果没有办法,那么在 C++ 标准中实现这种行为可能会出现什么问题?

4

4 回答 4

4

您的方法失败的原因有两个:

  1. BЈовић 描述了第一个原因:您不能在命名空间范围内引入嵌套类型的名称,请参阅 [namespace.udecl]/8。

  2. 写的时候using A::B::Value;,只会enum在当前作用域中引入自身的名字,而不是所有枚举数的名字。这允许以下内容:

    namespace Values { enum Value{ VALUE1, VALUE2 }; }
    using Values::Value;  // don't pollute my scope with the enumerators
    
    Value v = Values::VALUE1;
    

第二个问题可以通过单独引入枚举数来解决:

namespace A
{
    namespace B
    {
        enum Value
        {
              VALUE1
            , VALUE2
        };
    }
}

int main()
{
    using A::B::Value;
    using A::B::VALUE1;
    using A::B::VALUE2;

    Value v = VALUE1;
    v = VALUE2;
}

或者,正如hvd在评论中建议的那样,您可以使用 using 指令来引入命名空间的所有名称:

namespace A
{
    namespace B
    {
        enum Value
        {
              VALUE1
            , VALUE2
        };
    }
}

int main()
{
    using namespace A::B;

    Value v = VALUE1;
    v = VALUE2;
}
于 2013-11-10T11:37:34.450 回答
3

简单地说:这是不可能的,因为枚举是在类中定义的。

如果你改变class Bnamespace B

namespace A {

namespace B {
  enum Value {
    VALUE1 = 1,
    VALUE2 = 2,
  };
};

}

那么就可以这样做(正如您在代码中所写的那样):

using A::B::Value
于 2013-11-10T07:53:35.510 回答
0

枚举的处理方式类似于类。将其视为尝试执行以下操作:

class Value
{
public:
    static const int VALUE1 = 0;
};

using Value::VALUE1; // ERROR class-qualified name

简而言之:您不能通过using语句以这种方式使枚举值可见。

于 2013-11-10T08:04:46.817 回答
0

好吧,我能想到的最接近的是:

namespace A {
  class B {
  public:
    enum Value { VALUE1 = 1, VALUE2 = 2 };
  };
};

const A::B::Value VALUE1 = A::B::VALUE1;

int main () {
  return VALUE1;
}

但它相当乏味且容易出错,绝对不值得。:)

于 2013-11-10T10:38:51.060 回答