采用具体 Class 的模板 Class 采用模板 Class

Template Class that takes a Template Class that Takes a Concrete Class

虽然我看过一些关于将模板 classes 作为参数引入模板的帖子 class 我似乎找不到适合我的代码的东西,或者只是解释的不够明白

最终,我正在寻找采用另一个模板 class 的模板 class,后者采用标准 class。

*注意:为简洁起见,我只包含了我认为足够的信息。

我已经根据我能找到的信息进行了尝试,它显示在这里:

混凝土Class

class ConcreteClass {
   private:
      std::string words;
   public:
      ConcreteClass(std::string newWords);
};
#endif

模板Class模板

template <class ConcreteClass>
class TemplateClass{
   private:
     ConcreteClass stuff;
   public:
     TemplateClass(ConcreteClass fillStuff);
};

#endif


template <class ConcreteClass>
TemplateClass<ConcreteClass>::TemplateClass(ConcreteClass fillStuff) {
     stuff = fillStuff;
}

基础Class模板


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

首先,在template-templates的情况下,模板参数名称前需要一个classtypename关键字。其次,你应该把template<class>放在TemplateClass之前,而不是ConcreteClassTemplateClass 你的模板类型,所以它需要说明符:

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