问题描述
虽然我看到了几篇关于将模板类作为参数传入模板类的文章,但我似乎找不到与我的代码兼容的东西,或者只是我对解释不够了解。
>*注意:为简便起见,我仅列出了我认为足够的信息。
我已经根据发现的信息进行了尝试,并显示在此处:
具体课程
class ConcreteClass {
private:
std::string words;
public:
ConcreteClass(std::string newWords);
};
#endif
模板类模板
template <class ConcreteClass>
class TemplateClass{
private:
ConcreteClass stuff;
public:
TemplateClass(ConcreteClass fillStuff);
};
#endif
template <class ConcreteClass>
TemplateClass<ConcreteClass>::TemplateClass(ConcreteClass fillStuff) {
stuff = fillStuff;
}
基类模板
template<template<class> ConcreteClass,class TemplateClass>
class BaseClass {
private:
TemplateClass<ConcreteClass>* objPntr;
}
template<template<class> ConcreteClass,class TemplateClass>
BaseClass<TemplateClass<ConcreteClass>::BaseClass(TemplateClass<ConcreteClass>* newObj) {
objPntr = newObj;
}
template<template<class> ConcreteClass,class TemplateClass>
BaseClass<TemplateClass<ConcreteClass>::~BaseClass() {
if(objPntr) {
delete objPntr;
}
}
主要
int main() {
ConcreteClass cclass("some values");
TemplateClass tClass(cclass);
BaseClass(tClass);
return 0;
}
解决方法
首先,对于模板模板,在模板参数名称之前需要一个class
或typename
关键字。其次,您应该将template<class>
放在TemplateClass
之前,而不是ConcreteClass
之前。 TemplateClass
是您的模板化类型,因此需要该说明符:
#include <string>
// I had to make up your types because there is no definition for them
struct ConcreteClass {
std::string value;
};
template <typename T>
struct TemplateClass {
T t;
};
template<class ConcreteClass,template<class> class TemplateClass>
class BaseClass {
private:
TemplateClass<ConcreteClass>* objPntr;
// constructor needs to be declared before being defined
public:
BaseClass(TemplateClass<ConcreteClass> *objPntr);
};
template<class ConcreteClass,template<class> class TemplateClass>
BaseClass<ConcreteClass,TemplateClass>::BaseClass(TemplateClass<ConcreteClass>* newObj) {
objPntr = newObj;
}
int main() {
ConcreteClass cClass{"some values"};
TemplateClass<ConcreteClass> tClass{cClass};
BaseClass<ConcreteClass,TemplateClass> bClass(&tClass);
}