获得“枚举不是类或命名空间”错误 - C ++

6

我在头文件中声明了一个枚举(名为 Direction):

enum Direction {LEFT, RIGHT};

然后,我有一个构造函数,它需要一个方向值并将其设置为另一个方向变量(stringDirection)。

bool InformationWidget::move(Direction direction){
    stringDirection=direction;

return true;
}

最后,我有一个 if 语句来检查它的值:

if (stringDirection == Direction::RIGHT)

这是我遇到错误的地方,在那个 if 语句中…你有什么想法吗? 我尝试查找以前的线程,但没有找到有用的信息。谢谢! 编辑: 这是我的文件: Widget.h
enum class Direction {LEFT, RIGHT};

class Widget {
public:
     virtual bool...
     ...
};

information.h

class InformationWidget: public Widget {
public:
    ...
    Direction stringDirection;
    ...
};

information.cpp

void InformationWidget::show(){

...

if (stringDirection == LEFT) {
... }
}
1个回答

12

如果您想要作用域枚举并要求枚举值前缀为Direction::,请将枚举声明为enum classenum struct

enum class Direction {LEFT, RIGHT};
否则,如果您想要一个旧的C风格的枚举,则需要省略错误消息中抱怨的命名空间限定符Direction::
if (stringDirection == RIGHT)

请注意,在后一种情况下,枚举器标识符将被放置在全局命名空间中,这可能会导致它们与其他标识符发生冲突。


我真的不知道问题出在哪里...我在头文件中声明了枚举,在一个.cpp文件中包含了它(如果有必要,该文件实现了一个纯抽象基类的方法),但它就是无法工作... - Gambit2007
widget.h 被包含在 information.h 和 information.cpp 中,很抱歉没有说明。你的意思是什么?'Direction' 是枚举器的名称,就像已经指定的那样。 - Gambit2007
即使我这样做,它仍然会给我一个“Direction不是类或命名空间”的错误。我不知道这是否重要,但当我声明枚举时,它会给我一个警告“作用域枚举只能在-std=c++11下使用...”。无论如何,即使我从枚举声明中省略了“class”这个词,并使用“if(stringDirection==LEFT)”,它也不起作用。 - Gambit2007
是的,enum class 只适用于C++11及以上版本,因此您应该使用 -std=c++11 告诉编译器以C++11进行编译。或者推荐使用C++14。编译警告存在是有原因的。(而且这应该是编译错误,请检查您的编译选项是否合理,例如 -pedantic-errors。) - emlai
我该如何做到这一点?抱歉,我不知道。 - Gambit2007
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接