这可以编译,据我所知,你喜欢什么:
#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
则将使用该类型。
然后,专业化定义该单参数版本的类内容。
编辑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;
};