C++ C++;参数1从‘;节点*’;至‘;节点*&’;
我试图使用递归函数将节点插入到二叉搜索树中。然而,当我试图调用我的函数时,我得到了错误消息C++ C++;参数1从‘;节点*’;至‘;节点*&’;,c++,pointers,binary-search-tree,pass-by-reference,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; retu
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* 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;
或者,正如马特所说,你可以把recursiveAdd
当作朋友,然后就这样做
return recursiveAdd(start->leftChild, data);
不能将临时变量(getLeft和getRight返回的副本)与非常量左值引用绑定,因此会出现错误 无论如何,您不需要修改指针本身。我建议您重写您的算法,使其在没有这种奇怪且容易出错的要求的情况下工作
...
if (root == NULL)
{
Node* gnu = new Node(data);
root = gnu;
return true;
}
return recursiveAdd(root, data);
}
块范围。如果root
为空,那么最后将不会在块外声明root
。这意味着将使用无效参数调用recursiveAdd()
;这无法编译,否则它将始终有机会产生未定义的行为
不管怎样,由于根目录
将过期,引用也将过期,因为引用将指向临时对象。这是不正确的,因为引用不能绑定到临时对象——根据定义,它们将指向“值的容器”,在C++11术语中通常称为左值。
也有右值,但这超出了问题的范围。我要补充的是,有
getLeft
和getRight
返回引用是毫无意义的,而且将leftChild
和righchild
公开(或者让BST成为节点的朋友)会更简单如何在不修改至少一个指针的情况下修改树的结构?@Ben Voigt With setters?@Ben Voigt是的,我的意思是通过引用直接修改它。你应该使用你正在使用的类提供的接口。更仔细地考虑生命周期。
...
if (root == NULL)
{
Node* gnu = new Node(data);
root = gnu;
return true;
}
return recursiveAdd(root, data);
}