C ++没有已知的从'Node *'到'Node *&'的参数1的转换

时间:2015-06-06 01:57:58

标签: c++ pointers binary-search-tree pass-by-reference

我正在尝试使用递归函数将节点插入二叉搜索树。但是,当我尝试调用我的函数时,我收到错误消息

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

如果有人能告诉我需要修复它以使其正常工作,我将非常感激。

谢谢!

3 个答案:

答案 0 :(得分:1)

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

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

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

但是recursiveAdd需要能够修改结构

start = gnu;

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

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

或者,正如Matt所说,你可以让recursiveAdd成为朋友而只是做

return recursiveAdd(start->leftChild, data);

答案 1 :(得分:1)

您不能将临时变量(由getLeft和getRight返回的副本)与非const左值引用绑定,因此会出错。

无论如何,您不需要修改指针本身。我建议你重写你的算法,而不需要这个相当奇怪且容易出错的要求。

答案 2 :(得分:0)

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

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

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

还有 rvalues ,但这超出了问题的范围。