【问题标题】:Template Class that takes a Template Class that Takes a Concrete Class采用具体类的模板类的模板类
【发布时间】:2020-09-05 22:20:20
【问题描述】:

虽然我看过一些关于将模板类作为参数引入模板类的帖子,但我似乎找不到适用于我的代码的东西,或者只是我不太理解解释。

最终,我正在寻找一个模板类,该模板类采用另一个模板类,该模板类采用标准类。

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

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

具体类

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

【问题讨论】:

  • 请发送minimal reproducible example。你的问题不清楚。
  • 我很抱歉。我意识到我没有提供足够的代码来代表我的问题或意图,我会尽快更新。

标签: c++ templates template-templates


【解决方案1】:

首先,在模板模板的情况下,您需要在模板参数名称前加上classtypename 关键字。其次,您应该将template&lt;class&gt; 放在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);
}

【讨论】:

  • 得到一个编译器错误说明:BaseClass>:: has too little arguments as well as got 1 expected 2. 还有另一个错误说明模板声明冲突。
  • 这个解决方案是在我添加更多代码为我的情况提供更多上下文之前编辑的。该解决方案确实解决了我的问题。
猜你喜欢
  • 2010-11-06
  • 1970-01-01
  • 2021-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
  • 2011-10-24
相关资源
最近更新 更多