【问题标题】:Returning class-specific enum返回特定于类的枚举
【发布时间】:2014-07-28 10:58:59
【问题描述】:

我正在尝试实现一个简单的状态机。但是,当我遇到一个特殊的错误时:

State.cp:7:1: error: 'eState' does not name a type
 eState CState::eGet(){
 ^

eStateCState 类的枚举数:

#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; }

标签: c++ class gcc


【解决方案1】:

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

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

函数体、参数列表和尾随返回类型(如果存在)在类范围内,因此您不需要额外的限定。所以,从 C++11 开始,你也可以这样定义函数:

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

另外,您不应该像__STATE_H 那样使用reserved names。可以bite you later

【讨论】:

  • @medivh:确实,main 也不在类范围内,因此您还需要在该范围内指定范围:case CState::eData: 您只能在其范围内使用非限定名称。在这种情况下,这就是类的范围,即(大致)类定义本身及其成员函数定义。
【解决方案2】:

在源文件中没有名字eState在全局作用域,你必须使用作用域运算符::告诉编译器符号在哪个作用域:

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

不,编译器不需要知道您的意思是CState::eState,即使它可能已经弄清楚了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-07
    • 1970-01-01
    • 1970-01-01
    • 2018-02-23
    相关资源
    最近更新 更多