我正在尝试实现一个简单的状态机。但是,当我遇到一个奇怪的错误时:
State.cp:7:1: error: 'eState' does not name a type
eState CState::eGet(){
^
eState
是班级CState
中的枚举器:
#ifndef __STATE_H
#define __STATE_H
#include <string>
class CState {
public:
enum eState {
eData,
eInterface,
ePresentation,
eExit
};
它是(目前,非功能性)返回如下:
private:
eState Current;
public:
estate eGet();
其中eGet()
的定义如下:
eState CState::eGet(){
return Current;
};
我正在尝试使用.eGet()
作为切换值,但我的主要功能告诉我在此范围内声明了枚举值&#34;#34;
现在显然,我可以将枚举器移动到"Common.h"
文件并让每个人都#include
,但它显然属于州级,所以我更愿意保留它那里。
答案 0 :(得分:3)
枚举的作用域是在类中,但函数定义的返回类型不是。所以你需要指定范围:
CState::eState CState::eGet(){
return Current;
} // NOTE: no ; here
函数体,参数列表和尾随返回类型(如果存在)都在类范围内,因此您不需要额外的限定条件。所以,从C ++ 11开始,你也可以这样定义函数:
auto CState::eGet() -> eState {
return Current;
}
此外,您不应使用__STATE_H
之类的reserved names。它可以bite you later。
答案 1 :(得分:2)
在源文件中,全局范围内没有名称eState
,您必须使用作用域运算符::
来告诉编译器符号所在的范围:
CState::eState CState::eGet(){...}
不,编译器不需要知道你的意思是CState::eState
,即使它可能已经弄明白了。