7

这就是我想要实现的。叶组件将继承Component<ParentT>,其他组件将继承Component<ParentT, ChildT>

template <typename T>
class Component{
  protected:
    typedef Component<T> ParentComponentT;
  ...
};

template <typename ParentT, typename ChildT>
class Component: public Component<ParentT>{
  protected:
    typedef std::vector<ChildT*> CollectionT;
  ...
};

但问题是模板参数被重新声明。我不能将第二个移到第一个之上,因为第二个继承了第一个。

错误:使用 2 个模板参数重新声明
注意:先前的声明“模板类组件”使用了 1 个模板参数

4

1 回答 1

3

这可以编译,据我所知,你喜欢什么:

#include <vector>

class NoneT {};

template <typename ParentT,typename ChildT=NoneT>
class Component: public Component<ParentT>{
  protected:
    typedef std::vector<ChildT*> CollectionT;
};

专业化NoneT

template<>
template<typename T>
class Component<T,NoneT>{
protected:
   typedef Component<T> ParentComponentT;
};

int main(){
   typedef Component<double> someT;
   typedef Component<double,int> someT2;
   typedef Component<double,void> someT3;
}

someT将拥有ParentComponentT并将someT2拥有CollectionT

编辑:

回答以下评论/问题:typename ChildT=noneT表示默认ChildTnoneT. 因此,如果没有给出第二个模板参数,noneT则将使用该类型。

然后,专业化定义该单参数版本的类内容。

编辑2:

因为我从聊天中知道您使用 Component 作为基类,所以我建议不要使用类似的东西

class myclass: public Component<Section, Line>

你可以使用多重继承

class myclass: public ParentComponent<Section>, CollectionComponent<Line>

template <typename T>
class ParentComponent{
  protected:
    typedef Component<T> ParentComponentT;
};

template <typename ChildT>
class CollectionComponent {
  protected:
    typedef std::vector<ChildT*> CollectionT;
};
于 2012-08-05T07:43:58.400 回答