C++参数 1 没有从"节点*"到"节点*&"的已知转换

C++ no known conversion for argument 1 from ‘Node*’ to ‘Node*&’

本文关键字:节点 转换 参数 C++      更新时间:2023-10-16

我正在尝试使用递归函数将节点插入到二进制搜索树中。然而,当我尝试调用我的函数时,我会收到错误消息

no known conversion for argument 1 from ‘Node*’ to ‘Node*&’

这是递归函数和调用它的函数的代码:

bool BST::add(int data)
{
    if (root == NULL)
    {
        Node* gnu = new Node(data);
        root = gnu;
        return true;
    }
    return recursiveAdd(root, data);
}
bool BST::recursiveAdd(Node*& start, int data)
{
    if (start == NULL)
    {
        Node* gnu = new Node(data);
        start = gnu;
        return true;
    }
    if (data < start->getData())
    {
        return recursiveAdd(start->getLeft(), data);
    }
    if (data > start->getData())
    {
        return recursiveAdd(start->getRight(), data);
    }
    if (data == start->getData())
    {
        return false;
    }
    return false;
}

以下是Node类中getLeft((、getRight((和getData((的函数:

 int Node::getData()
{
    return data;
}
Node* Node::getLeft()
{
    return leftChild;
}
Node* Node::getRight()
{
    return rightChild;
}

如果有人能向我展示我需要修复什么才能正常工作,我将不胜感激。

谢谢!

您无法将临时变量(getLeft和getRight返回的副本(与非常量左值引用绑定,因此会出现错误。

无论如何,您都不需要修改指针本身。我建议你重写你的算法,使其在没有这种奇怪且容易出错的要求的情况下工作。

您的访问者返回内部指针的副本

Node* Node::getLeft()
{
    return leftChild;
}
Node* Node::getRight()
{
    return rightChild;
}

但是recursiveAdd需要能够修改的结构

start = gnu;

这些方法不兼容,幸运的是编译器抓住了你。您可以更改getLeft()getRight()以返回引用,也可以捕获recursiveAdd()所做的结构更改并使用赋值函数进行传播。

Node* theLeft = start->getLeft();
bool did_insert = recursiveAdd(theLeft, data);
start->setLeft(theLeft);
return did_insert;

或者,正如马特所说,你可以让recursiveAdd成为朋友,只做

return recursiveAdd(start->leftChild, data);
...
    if (root == NULL)
    {
        Node* gnu = new Node(data);
        root = gnu;
        return true;
    }
    return recursiveAdd(root, data);
}

块范围。如果root为NULL,那么在块之外就不会有root的声明。这意味着recursiveAdd()将被一个无效的参数调用;这不能编译,否则它总是有机会产生未定义的行为。

无论如何,由于root将过期,引用也将过期,因为引用将指向临时对象。这是不正确的,因为引用不能绑定到临时对象——根据定义,它们将指向"值的容器",在C++11中通常称为lvalues

也有右值,但这超出了问题的范围。