gpt4 book ai didi

c++ - 尝试通过引用传递指针时出现此错误

转载 作者:行者123 更新时间:2023-11-28 02:11:00 25 4
gpt4 key购买 nike

我正在尝试在 BST 中创建一个删除节点函数,我需要通过引用传递一个指针,以便我可以更改指针,但我一直收到此错误:

“void Tree::deletNode(T,Node *&)”:无法将参数 2 从“Node *”转换为“Node *&”

其中有 2 个错误发生在 deletNode 递归调用自身时。

程序在我没有 & 但没有按预期运行时运行。

这些是我的 2 个函数,它们应该删除 BST 中的一个节点。树的根指针称为 root,Node 是节点类型。此外,还会调用调用 makedelete 的 deletNode 函数。但是用户调用 deletNode

    void deletNode(T num, Node<T> *& nodeptr)
{
if (num < nodeptr->getData())
deletNode(num, nodeptr->getLeft());
else if (num > nodeptr->getData())
deletNode(num, nodeptr->getRight());
else
{
cout << "called makedelete on " << nodeptr << "which has " << nodeptr->getData() << endl;
makedelete(nodeptr);
}
}

void makedelete(Node<T> *& nodeptr)
{
Node<T> * tempnode;

if (nodeptr == nullptr)
cout << "error..." << endl;
else if (nodeptr->getRight() == nullptr)
{
tempnode = nodeptr;
nodeptr = nodeptr->getLeft();
delete tempnode;
}
else if (nodeptr->getLeft() == nullptr)
{
tempnode = nodeptr;
nodeptr = nodeptr->getRight();
delete tempnode;
}
else //has 2 kids
{
tempnode = nodeptr->getRight(); ///move 1 node to right

while (tempnode->getLeft()) // go to end of left
{
tempnode = tempnode->getLeft();
}

tempnode->setLeft(nodeptr->getLeft());
tempnode = nodeptr;
nodeptr = nodeptr->getRight();
delete tempnode;

}
}

};

这是节点类:

template <typename T>
class Node
{
T data;
Node* left;
Node* right;
public:
T getData() { return data; }
Node<T>* getLeft() { return left; }
Node<T>* getRight() { return right; }
void setData(T t) { data = t; }
void setLeft(Node<T>* pLeft) { left = pLeft; }
void setRight(Node<T>* pRight) { right = pRight; }
};

最佳答案

Node<T>* getLeft() { return left; }

这按值返回。所以返回 Node<T>*是临时的。请注意,因为您返回 left 而不是对 left 的引用或指向 left 的指针, 你不能修改 left调用getLeft .

void deletNode(T num, Node<T> *& nodeptr)

这需要对 Node<T>* 的非常量引用.

    deletNode(num, nodeptr->getLeft());

在这里,您尝试调用 deletNodegetLeft 返回的临时文件上.但是您不能将非常量引用绑定(bind)到临时引用。您不能修改 left通过返回 getLeft ,因为它既不返回引用也不返回指针。

修复取决于您真正想做什么,但绝对不是尝试将临时变量传递给采用非常量引用的函数。您是否在等候电话 deletNode修改nodeptr->left ?如果是这样,getLeft需要返回一个引用。

关于c++ - 尝试通过引用传递指针时出现此错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35676262/

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