gpt4 book ai didi

c++ - ' =' : cannot convert from ' CircularDoubleDirectedList::节点 *' to ' 节点 *'

转载 作者:行者123 更新时间:2023-11-30 02:39:22 29 4
gpt4 key购买 nike

我有 Node* current ,我在其中存储指向列表“顶部”当前节点的指针。当我将一个新节点设置为当前节点时,出现错误:

'=' : 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
};

关于c++ - ' =' : cannot convert from ' CircularDoubleDirectedList<int>::节点 *' to ' 节点 *',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29868972/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com