返回特定于类的enum

Returning class-specific enum

本文关键字:enum 于类 返回      更新时间:2023-10-16

我想实现一个简单的状态机。然而,当我得到一个奇怪的错误:

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()作为开关值,但我的主要功能告诉我枚举值不是"在此范围内声明"

显然,我可以把枚举器移到"Common.h"文件中,让每个人都有#include,但它显然属于状态类,所以我更愿意把它留在那里。

枚举的作用域在类内部,但函数定义的返回类型不是。所以你需要指定作用域:

CState::eState CState::eGet(){
    return Current;
}  // NOTE: no ; here

函数体、参数列表和后面的返回类型(如果存在的话)都在类作用域中,因此您不需要在那里进行额外的限定。因此,从c++ 11开始,您还可以这样定义函数:

auto CState::eGet() -> eState {
    return Current;
}

同样,你不应该使用像__STATE_H这样的保留名称。这可能会伤到你。

在源文件中全局作用域中没有名称eState,您必须使用作用域操作符::来告诉编译器该符号处于哪个作用域:

CState::eState CState::eGet(){...}

不,编译器不需要知道你指的是CState::eState,即使它可能已经算出来了。