首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >我的枚举不是类或命名空间

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

Stack Overflow用户
提问于 2011-03-04 09:06:53
回答 3查看 51.2K关注 0票数 62

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

在MyCode.h中,我声明了

代码语言:javascript
复制
enum MyEnum {Something = 0, SomethingElse = 1};

class MyClass {

MyEnum enumInstance;
void Foo();

}; 

然后在MyCode.cpp中:

代码语言:javascript
复制
#include "MyCode.h"

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

但是当使用g++编译时,我得到错误'MyEnum‘不是一个类或名称空间...

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-03-04 09:15:30

语法MyEnum::SomethingElse是微软的一个扩展。它碰巧是我喜欢的,但它不是标准的C++。将enum值添加到周围的名称空间:

代码语言:javascript
复制
 // header
 enum MyEnum {Something = 0, SomethingElse = 1};

 class MyClass {

 MyEnum enumInstance;
 void Foo();

 }

 // implementation
 #include "MyClass.h"

 void Foo() {
     enumInstance = SomethingElse;
 }
票数 66
EN

Stack Overflow用户

发布于 2011-03-04 09:13:29

在C++0x之前,作用域枚举将不存在。目前,您的代码应该是

代码语言:javascript
复制
enumInstance = SomethingElse;

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

票数 51
EN

Stack Overflow用户

发布于 2015-11-06 18:48:03

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

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

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

代码语言:javascript
复制
enum MyEnum {MyEnum_A, MyEnum_B};
void A(void) {
    MyEnum enumInstance = MyEnum_A;
}

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

代码语言:javascript
复制
namespace MyEnum {
    enum Value {A,B};
}
void A(void) {
    MyEnum::Value enumInstance = MyEnum::A
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5188554

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档