>我有 Node* 当前,我在其中存储指向列表"顶部"当前节点的指针。当我将新节点设置为当前节点时,出现错误:
'=' : cannot convert from 'CircularDoubleDirectedList<int>::Node *' to 'Node *'
while compiling class template member function 'void CircularDoubleDirectedList<int>::addAtCurrent(const T &)' with [ T=int ]
如果将它们拿走,则带有//Problem 注释的三行会生成这些错误,一切正常。
#include "ICircularDoubleDirectedList.h"
template <typename T> class CircularDoubleDirectedList;
class Node;
template <typename T>
class CircularDoubleDirectedList :
public ICircularDoubleDirectedList<T>{
public:
//Variables
Node* current;
int nrOfElements;
direction currentDirection;
//Functions
CircularDoubleDirectedList();
~CircularDoubleDirectedList();
void addAtCurrent(const T& element) override;
private:
class Node
{
public:
T data;
Node* forward;
Node* backward;
Node(const T& element);
};
};
template <typename T>
void CircularDoubleDirectedList<T>::addAtCurrent(const T& element){
Node* newNode = new Node(element);
newNode->data = element;
if (this->nrOfElements == 0){
newNode->forward = newNode;
newNode->backward = newNode;
}
else{
this->current->forward = newNode; // Problem
this->current->forward->backward = newNode; // Problem
}
this->current = newNode; //Problem
}
当您转发声明Node
在此处的类之外时:
template <typename T> class CircularDoubleDirectedList;
class Node;
即在全局命名空间中声明类型Node
。这是::Node
.然后,在您的类声明中,current
采用该类型:
template <typename T>
class CircularDoubleDirectedList
: public ICircularDoubleDirectedList<T>
{
public:
Node* current; // this is a pointer to ::Node.
};
然后,您提供CircularDoubleDirectedList<T>::Node
声明。这与 ::Node
的类型不同。它还首先通过名称解析规则进行查找。所以在这里:
template <typename T>
void CircularDoubleDirectedList<T>::addAtCurrent(const T& element){
Node* newNode = new Node(element); // newNode is a pointer to
// CircularDoubleDirectedList<T>::Node
但是current
是指向仍然不完整的类型::Node
的指针。因此出现错误 - 您无意中创建了两个名为 Node
的类型。
如果你要向前声明Node
,你必须在类中这样做:
template <typename T>
class CircularDoubleDirectedList
: public ICircularDoubleDirectedList<T>
{
class Node; // NOW it's CircularDoubleDirectedList<T>::Node
};