这就是我想要实现的目标。 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个模板参数
答案 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;
}
someT
将ParentComponentT
,someT2
将CollectionT
。
编辑:
回答下面的评论/问题:typename ChildT=noneT
表示默认ChildT
为noneT
。因此,如果没有给出第二个模板参数,则将使用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;
};