'=' : 无法从'CircularDoubleDirectedList<int>::Node *'转换为'Node *'

'=' : cannot convert from 'CircularDoubleDirectedList<int>::Node *' to 'Node *'

本文关键字:Node gt 转换 int CircularDoubleDirectedList lt      更新时间:2023-10-16

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