Enum使用问题

时间:2016-03-18 10:33:39

标签: c++ enums identifier

我对Enum有一个问题(我想它的用法):我在一个类中声明了一个Enum,我试图在它的子类中使用它。这里是(抽象)超类:

//Function.h
class Function {
public:
    enum FunctionType {
        constant,
        variable,
        sum,
        mul
    };
    ...
    virtual FunctionType getType();
};

这里有一个子类:

//Const.h
#include "Function.h"

#ifndef CONST_H_
#define CONST_H_

class Const:public Function {
    ....
public:
    Const(double x);
    ....
    Function::FunctionType getType();
    ....
    ~Const();
};

#endif /* CONST_H_ */

及其实施:

//Const.cpp
#include "Const.h"
#include "Function.h"


Function::FunctionType Const::getType(){
    return Function::FunctionType::constant;
}
....

编译器抛出以下错误:

error: ‘Function::FunctionType’ is not a class or namespace
return Function::FunctionType::constant;
                 ^

我无法找出为什么会出现此错误,以及这段代码听起来容易和听起来有什么问题(当然不是这样)。

3 个答案:

答案 0 :(得分:8)

要限定枚举值,请不要使用枚举类型名称:

enum enum_t { ENUM_VALUE };
auto e = ENUM_VALUE; // no enum_t::

在您的情况下,解决方案是:

struct Function {
    enum FunctionType {
        constant
    };
    virtual FunctionType getType();
};

struct Const : Function {
    Function::FunctionType getType() { return Function::constant; }
};

Function::FunctionType::constant是一个错误的事实来自枚举是一个C函数来声明常量。从cppreference.com page on the enum可以看出:

  

无范围枚举

     

enum name { enumerator = constexpr , enumerator = constexpr , ... }(1)
  1)声明一个 unscoped枚举类型,其底层类型不固定(在这种情况下,底层类型是int或者,如果不是所有枚举器值都可以表示为int,则实现定义的更大的积分可以表示所有枚举器值的类型。如果枚举器列表为空,则基础类型就好像枚举具有值为0的单个枚举器。

如果您想使用强类型的范围内容,请参阅@Angrew answer和enum class

答案 1 :(得分:4)

https://devmaze.wordpress.com/2011/01/18/using-com-android-internal-part-1-introduction/在解释您收到的错误时100%正确。

要添加更广泛的上下文,从C ++ 11开始,以作用域枚举的形式支持您最初打算使用的语法。这些是枚举,其中与整数的隐式转换是不可用,枚举器的名称在枚举范围内。它们由语法enum class引入。

这与未范围的枚举(仅使用enum得到的)形成对比,其中不存在这样的范围规则。枚举名称不会引入范围,因此在范围解析运算符::的左侧使用它是一个错误。

您可以在代码中使用范围内的枚举,如下所示:

class Function {
public:
    enum class FunctionType {
        constant,
        variable,
        sum,
        mul
    };
    ...
    virtual FunctionType getType();
};

Function::FunctionType Const::getType(){
    return Function::FunctionType::constant;
}

请注意,在FunctionType::constant派生的类中,不需要将Function::FunctionType::constant限定为Function;对Function继承的所有成员的访问是隐含的。

答案 2 :(得分:0)

尝试:

return Function::constant;

而不是:

return Function::FunctionType::constant;