C++参数 1 没有从"节点*"到"节点*&"的已知转换
C++ no known conversion for argument 1 from ‘Node*’ to ‘Node*&’
我正在尝试使用递归函数将节点插入到二进制搜索树中。然而,当我尝试调用我的函数时,我会收到错误消息
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
也有右值,但这超出了问题的范围。
相关文章:
- 如何将节点 V8 字符串转换为 C++ 字符串
- 没有从"树节点"到"树节点*"的可行转换
- 将节点数组(可变长度)转换为常量浮点**以调用opencv.calcHist
- 正在初始化:无法从'_Ty*'转换为 List<int,std::分配器<节点<T>>>:节点*
- 错误:无法从节点*转换为节点 c++?
- 指针取消引用:无法将“节点**”转换为“节点*”
- 无法将参数从"this"转换为节点<T>*
- 用指针 *将C 转换为JavaScript(节点)
- 如何将XML节点数据转换为QT中的字符串
- 如何将节点插件持久<function>转换为本地<function>?
- 在从通用树转换的二进制树中查找节点的父
- 如何使用指针C++将类的析构函数转换为另一个类?类似于单向列表容器类和节点类
- 将阵列转换为节点
- 转换为模板类(节点)
- 如何将列表'node_ptr'转换为我自己的节点类型
- 错误 C2440:"=":无法从"列表节点 *"<T>转换为"列表节点<T> *"
- 在C++中实现图形节点时将 C# 类转换为C++
- 无法在赋值中将"列表节点**"转换为"列表节点*"
- 用于c++的XML解析器,它将XML节点转换为c++对象
- C++中的树实现:无法将节点转换为节点*