包含具体类的模板类的模板类

问题描述

虽然我看到了几篇关于将模板类作为参数传入模板类的文章,但我似乎找不到与我的代码兼容的东西,或者只是我对解释不够了解。

>

最终,我正在寻找一个带有另一个带有标准类的模板类的模板类。

*注意:为简便起见,我仅列出了我认为足够的信息。

我已经根据发现的信息进行了尝试,并显示在此处:

具体课程

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;
}

解决方法

首先,对于模板模板,在模板参数名称之前需要一个classtypename关键字。其次,您应该将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);
}