以下情况:
class FeatureBase
class Feature1 : public FeatureBase
class FeatureAttrBase
class Feature1Attr : public FeatureAttrbase
FeatureBase包含FeatureAttrBase列表,应该能够创建和管理这些对象。因此我在FeatureBase上使用模板。
template<class T = FeatureAttrBase> class FeatureBase
创建和管理属性(例如new T())
,子类使用专门的继承
class Feature1 : public FeatureBase<Feature1Attr>
我的代码中的其他地方我写了一个方法
RegisterFeature(FeatureBase<FeatureAttrBase>* feature)
但编译器给我一个错误,它无法在Feature1和FeatureBase之间进行转换。在上述方法中,我只需要使用FeatureAttrBase中的信息。但在Feature1内部,我需要访问Feature1Attr。
因此问题是如何解决这个问题?我是否必须更改我的数据结构?
答案 0 :(得分:1)
让模板参数相互继承不会使模板类相关。您应该执行以下操作(可能不是最佳解决方案,但您没有指定您要执行的操作):
class FeatureAttrBase;
class FeatureBase
{
public:
virtual FeatureAttrBase* GetAttributes() = 0;
};
template<class T>
class FeatureImpl : public FeatureBase
{
T attr;
public:
FeatureAttrBase* GetAttributes()
{
return &attr;
}
};
class Feature1Attr : public FeatureAttrBase;
class Feature1 : public FeatureImpl<Feature1Attr>;
实际上,您可能不需要FeatureImpl
类,并且可以将实现直接放在Feature1
类中(并完全删除模板)。
答案 1 :(得分:0)
您可以从FeatureBase
继承FeatureBase<FeatureAttrBase>
的专精。像这样:
// Forward declaration
template <typename T>
class FeatureBase;
// Type selecting trait class FeatureBase_BaseClass
// FeatureBase for derived Attrs will inherit from FeatureBase<FeatureAttrBase>
template <typename T>
struct FeatureBase_BaseClass
{
typedef FeatureBase<FeatureAttrBase> Type;
};
// FeatureBase<FeatureAttrBase> will inherit from a dummy type
template <>
struct FeatureBase_BaseClass<FeatureAttrBase>
{
struct Type {};
};
// Use FeatureBase_BaseClass to select the proper base class for FeatureBase
template <typename T = FeatureAttrBase>
class FeatureBase : public FeatureBase_BaseClass<T>::Type
{
//as before
};
这样,特定属性FeatureBase<X>
的所有X
都将从FeatureBase<FeatureAttrBase>
继承。