1

以下情况:

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。

因此问题是如何解决这个问题?我必须改变我的数据结构吗?

4

2 回答 2

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类中(并完全摆脱模板)。

于 2013-04-08T09:03:34.410 回答
0

您可以继承FeatureBasefrom 的特化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>.

于 2013-04-08T09:04:05.900 回答