初始化在模板化父项中定义的结构 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 typename
。 dummyAdd
函数中的意思,需要
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...
};
我在父 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 typename
。 dummyAdd
函数中的意思,需要
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...
};