模板参数重新声明

时间:2012-08-05 06:25:22

标签: c++ templates

这就是我想要实现的目标。 leaf组件将继承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个模板参数重新声明   注意:先前的声明'模板类Component'使用了1个模板参数

1 个答案:

答案 0 :(得分: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;
}

someTParentComponentTsomeT2CollectionT

编辑:

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

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

<强> EDIT2:

由于我从聊天中知道您使用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;
};