我有这个基础和这些派生类
class AlarmType
{
public:
unsigned int alarmIndex;
};
class TrendAlarmType : public AlarmType
{
public:
typedef enum
{
decreasing = 0, //will be used as index apart from enum
steady,
increasing
} Trend_types;
Trend_types alarmIndex2;
};
class ThresholdAlarmType : public AlarmType
{
public:
typedef enum
{
low = 0, //will be used as index apart from enum
lowmid,
highmid,
high,
} Threshold_types;
Threshold_types alarmIndex3;
};
此处alarmIndex2
和alarmIndex3
的类型不同,因此AlarmType::alarmIndex
不应存在。
是否可以声明模板
理想情况下,alarmIndex
将是基类的模板成员,alarmIndex2 & 3
将不存在。可能吗?我正在尝试将AlarmType
实现为模板类
template< typename T>
class AlarmType
{
public:
unsigned int alarmIndex;
};
然后尝试从派生类中访问alarmIndex
,如下所示
alarmIndex<Trend_types> = tt; OR
alarmIndex<Threshold_types> = tt;
我收到大量错误,首先出现“错误:行'{'token'之前的预期类名
class TrendAlarmType : public AlarmType
{ ...
如果我尝试添加我想要的类型
class TrendAlarmType : public AlarmType<Trend_types>
{ ...
Trend_types
尚未宣布。所以我遇到了其他麻烦。有没有办法在基类中声明变量?
谢谢
答案 0 :(得分:1)
我不是100%清楚你要完成什么,但我相信你所寻找的不是继承,而是模板别名,这是在C ++ 11(C ++ 11-)中引入的支持编译器是必需的):
typedef enum
{
decreasing = 0, //will be used as index apart from enum
steady,
increasing
} Trend_types;
typedef enum
{
low = 0, //will be used as index apart from enum
lowmid,
highmid,
high,
} Threshold_types;
template<typename T> using alarmIndex=T;
这使得可以使用以下语法:
alarmIndex<Trend_types> t1 = decreasing;
alarmIndex<Threshold_types> t2 = lowmid;
根据你的问题,这似乎是你想要实现的语法。
但是让我们更进一步,并使用枚举类强制执行类型安全:
enum class Trend_types
{
decreasing = 0, //will be used as index apart from enum
steady,
increasing
};
enum class Threshold_types
{
low = 0, //will be used as index apart from enum
lowmid,
highmid,
high,
};
template<typename T> using alarmIndex=T;
// ...
alarmIndex<Trend_types> t1 = Trend_types::decreasing;
alarmIndex<Threshold_types> t2 = Threshold_types::lowmid;
使用枚举类,编译器将强制执行类型安全,并拒绝尝试将Threshold_types
值分配给Trend_types
实例(自己尝试)。
请注意,模板别名是通用的,并且会为任何类提供此语法糖,而不仅仅是这两个。
如果您真的想要,可以通过更多工作限制模板别名仅适用于这两个类。