在课堂上向前声明未编入范围的枚举抱怨私有

时间:2017-04-04 20:13:04

标签: c++11 enums forward-declaration

为什么以下c ++ 11/14代码不起作用?在这里,我向前宣布课堂上的一个枚举。目标不是在类中有大量的枚举值 - 这使得类不可读。出于政治原因,我无法使用单独的范围枚举。

public void Voice() throws IOException {
   Process p;
   String work = "cmd /c nircmd.exe sendkey a press"; // used nircmd utility

   p = Runtime.getRuntime().exec(work);
   String output="";
   BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));

   while ((output = reader.readLine()) !=null) {
       System.out.println(output);
   }

   reader.close();
}

编译错误

class A {
public:
  // forward declare the enum
  enum B : int;
  void func (B b) {}
};

// The actual declaration
enum A::B  : int {
    Val1,
    Val2,
};

int main ()
{
    // B is unscoped. so I should be able to use it as below?
    int a = A::Val1;
}

但以下代码有效:

tmp.cpp: In function ‘int main()’:
tmp.cpp:13:5: error: ‘A::B Val1’ is private
     Val1,
     ^

tmp.cpp:19:16: error: within this context
     int a = A::Val1;
                ^

1 个答案:

答案 0 :(得分:0)

该错误出现在G ++中,但不出现在Visual C ++和clang中。正式枚举的id可以用作命名空间,也可以跳过,但最后两个默认跳过它,而最新的g ++强制执行它。这可以通过编译器选项进行更改。使用枚举类' id是强制性的:

class A {
public:
  // forward declare the enum
  enum class B : int;
  void func (B b) {}
};

// The actual declaration
enum class A::B  : int {
    Val1,
    Val2,
};

int main ()
{
    int a = static_cast<int>(A::B::Val1); // no implicit cast
}