我有一个从NodeInterface继承的节点类,它具有两个函数NodeInterface * return(Left / Right)Child()。这是一个类,我们必须遵循此NodeInterface。
我正在尝试为BST创建add()函数,并且需要将当前节点传递给递归add函数作为参考。
bool add(T data) {
return addNodeToNode(data, root);
};
bool addNodeToNode(T data, NodeInterface<T>*& cNode) {
if ((cNode) == nullptr || cNode == NULL) {
(cNode) = new Node<T>(data);
return true;
}
int nodeData = (cNode)->getData();
if (data == (cNode)->getData()) return false;
if (data < nodeData) {
addNodeToNode(data, cNode->getLeftChild());
}
if (data > nodeData) {
addNodeToNode(data, cNode->getRightChild());
}
return true;
};
但是我一直收到错误C2440:'正在初始化':当我调用addNodeToNode(data, cNode->getLeftChild());
或addNodeToNode(data, cNode->getRightChild());
时无法从'NodeInterface *'转换为'NodeInterface *&'
这让我感到非常困惑,因为root是指向NodeInterface对象的指针,并且add(T data)函数在第二个参数为root的情况下调用addNodeToNode没问题。
答案 0 :(得分:1)
您试图将非const左值引用传递给不合法的临时(函数调用的返回值)。一种解决方案是创建采用r值引用的addNodeToNode重载,另一种解决方案是使您的getLeftChild / getRightChild返回引用对指针而不是仅返回指针(这样,您将对存储在节点中的实际指针进行引用)对象)。
但是,老实说,尝试让cNode担当输入节点对象的双重角色,并输出一个新创建的节点,这使我感到非常糟糕。如果您将cNode设置为仅输入(因此放弃了对其进行引用的要求)并设置了addNodeToNode的返回值,则实现BST的新节点对象将容易得多。