Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我的枚举不是类或命名空间_C++_Enums_G++_C++11 - Fatal编程技术网

C++ 我的枚举不是类或命名空间

C++ 我的枚举不是类或命名空间,c++,enums,g++,c++11,C++,Enums,G++,C++11,嗨,我有文件名为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; }

嗨,我有文件名为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”不是类或命名空间

(在MS VS2010中可以正常工作,但在linux g++中不行)

有什么想法吗? 谢谢
在C++0x之前,作用域枚举将不存在。目前,您的代码应该是

enumInstance = SomethingElse;

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

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

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

 class MyClass {

 MyEnum enumInstance;
 void Foo();

 }

 // implementation
 #include "MyClass.h"

 void Foo() {
     enumInstance = SomethingElse;
 }

实际上,C++0x允许这种特性。我可以使用以下命令行标志在gcc中成功地启用它:-std=c++0x


这是在gcc版本4.4.5中出现的,正如其他答案中所解释的:语法
MyEnum::SomethingElse
在常规C++98枚举上无效,除非编译器通过非标准扩展支持它们

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

因此,用户应该在每个枚举值处引用类型名称。避免两次声明错误的示例:

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
}

注意:在
.cpp
文件中,如果您想为
MyClass::foo
提供一个实现,那么签名将是
void MyClass::foo(){…}
。您缺少
MyClass::
bit.MyCode.h!=我的班级。。。不过,我怀疑这会有所帮助:大胆地说,C++0x将增加这种能力,我认为这种能力在相当长的一段时间内是缺乏的,非常需要。谢谢。这让我发疯。我不明白为什么我的枚举会在一个XCode项目中解析,而不是在另一个XCode项目中解析。O.O虽然我仍然不知道为什么会发生这种情况,但我知道解决办法。如果有人敢猜,我很乐意知道。谢谢,帮我节省了时间