初始化在模板化父项中定义的结构 class

Initialization of a struct defined in a templated parent class

我在父 class 的受保护部分中定义了一个结构,我想在继承的 class.

中使用它

如果 parent/child classes 没有模板化 classes,这将按预期工作。但不会按原样编译。

具体而言,编译器 (clang 8.0.1) 报告:

inheritance_example.cpp:33:26: error: unknown type name 'Node'
        this->head = new Node(toAdd);

据我所读,我猜测模板类型规范未分配给 Node,因此继承的 class 未找到模板类型规范,但正在尝试修复我发现这种情况(即按照 using Parent<T>::Node 行添加一些内容,或者在对 Node 构造函数的调用中添加类型说明符)对我不起作用。

关于如何解决这个问题有什么想法吗?

#include<iostream>

template <class T>
class Parent 
{
protected:
   struct Node
   {
      Node(int value) 
      {
         this->data = value;
         this->next = nullptr;
      };

      ~Node() {};
      Node* next;
      int data;
   };

   Node* head;

public:
   Parent() {};
   ~Parent() {};
};

template <class T>
class Child : Parent<T>
{
public:

   Child() 
   {
      this->head = nullptr;
   };

   ~Child()
   {
      delete this->head;
      this->head = nullptr;
   };

   void dummyAdd(T toAdd) {
      this->head = new Node(toAdd);
   };

   void dummyPrint() 
   {
      std::cout << this->head->data << std::endl;
   };
};

int main() 
{
   Child<int> t;
   t.dummyAdd(5);
   t.dummyPrint();
   return 0;
}

为了把评论打包成答案!

Node 是一个依赖名称,因此您需要在那里使用 keyword typenamedummyAdd函数中的意思,需要

void dummyAdd(T toAdd) 
{
   this->head = new typename Parent<T>::Node(toAdd);
   //               ^^^^^^^^^^^^^^^^^^^^ 
};

也就是说,然而,有点冗长/打字更多。因此,在 Child 中为 Node 提供 type alias 将是一个好主意。

template <class T>
class Child : Parent<T> 
{
   using Node = typename Parent<T>::Node;  // template type alias

public:
   void dummyAdd(T toAdd) 
   {
      this->head = new Node(toAdd);       // now you can this
   };

   // other code...
};