【问题标题】:My enum is not a class or namespace我的枚举不是类或命名空间
【发布时间】:2011-07-08 11:53:53
【问题描述】:

您好,我有名为 MyCode.h 和 MyCode.cpp 的文件

在 MyCode.h 我已经声明

enum MyEnum {Something = 0, SomethingElse = 1};

class MyClass {

MyEnum enumInstance;
void Foo();

}; 

然后在 MyCode.cpp 中:

#include "MyCode.h"

void MyClass::Foo() {
    enumInstance = MyEnum::SomethingElse;
}

但是当使用 g++ 编译时,我得到错误 'MyEnum' is not a class or namespace...

(在 MS VS2010 中运行良好,但在 linux g++ 中运行良好)

有什么想法吗? 谢谢 托马斯

【问题讨论】:

  • 注意:在您的.cpp 文件中,如果您想为MyClass::foo 提供一个实现,签名将是void MyClass::Foo() { ... }。您缺少 MyClass:: 位。
  • MyCode.h != MyClass.h ... 怀疑这有帮助:P

标签: c++ enums g++ c++11


【解决方案1】:

正如其他答案中的解释:语法 MyEnum::SomethingElse 在常规 C++98 枚举上无效,除非您的编译器通过非标准扩展支持它们。

我个人不喜欢 enum MyEnum {A, B}; 声明,因为在使用枚举值时类型名称不存在。这可能会导致当前名称空间中的名称冲突。

所以用户应该在每个枚举值中引用类型名称。避免两次声明 A 的示例:

enum MyEnum {MyEnum_A, MyEnum_B};
void A(void) {
    MyEnum enumInstance = MyEnum_A;
}

我更喜欢使用特定的名称空间或结构。 这允许使用最新的 C++ 样式引用枚举值:

namespace MyEnum {
    enum Value {A,B};
}
void A(void) {
    MyEnum::Value enumInstance = MyEnum::A
}

【讨论】:

    【解决方案2】:

    确实,C++0x 允许该功能。我可以使用以下命令行标志在 gcc 中成功启用它:-std=c++0x

    这是 gcc 版本 4.4.5

    【讨论】:

    • 谢谢,帮我节省了时间
    【解决方案3】:

    语法 MyEnum::SomethingElse 是 Microsoft 扩展。它恰好是我喜欢的一种,但它不是标准 C++。 enum 值被添加到周围的命名空间中:

     // header
     enum MyEnum {Something = 0, SomethingElse = 1};
    
     class MyClass {
    
     MyEnum enumInstance;
     void Foo();
    
     }
    
     // implementation
     #include "MyClass.h"
    
     void Foo() {
         enumInstance = SomethingElse;
     }
    

    【讨论】:

    • 幸运的是,C++0x 将增加这种能力,我认为它在相当长的一段时间内都缺乏并且非常需要。
    • 谢谢。它把我逼疯了。我不明白为什么我的枚举会在一个 XCode 项目中解析,而不是在另一个项目中解析。 O.o 虽然我仍然不知道为什么会发生这种情况,但我知道解决方法。如果有人冒险猜测,我会很高兴知道..
    【解决方案4】:

    作用域枚举在 C++0x 之前不会存在。暂时,你的代码应该是

    enumInstance = SomethingElse;
    

    您可以通过将枚举的定义放在它自己的命名空间或结构中来创建一个人工作用域枚举。

    【讨论】:

      猜你喜欢
      • 2016-03-27
      • 2014-07-24
      • 1970-01-01
      • 2016-06-22
      • 1970-01-01
      • 2014-04-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多