我对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;
^
我无法找出为什么会出现此错误,以及这段代码听起来容易和听起来有什么问题(当然不是这样)。
答案 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;