如何解决为什么在此处通过引用传递指针会导致错误?
我有一个模板节点类:
template<typename T>
class TNode {
T data;
TNode<T>* left;
TNode<T>* right;
public:
TNode() { left = right = nullptr; }
TNode(T d) { data = d; left = right = nullptr; }
void setData(T d) { data = d; }
T getData() { return data; }
void setLeft(TNode<T>* l) { left = l; }
TNode<T>* getLeft() { return left; }
void setRight(TNode<T>* r) { right = r; }
TNode<T>* getRight() { return right; }
};
我用来构建以下二进制搜索树:
template<typename T>
class BSTree
{
private:
TNode<T>* root;
void rec_insertBST(TNode<T>*& subRoot,int key)
{
if (subRoot == nullptr)
subRoot = new TNode<T>(key);
else if (subRoot->getData() < key)
rec_insertBST(subRoot->getRight(),key);
else
rec_insertBST(subRoot->getLeft(),key);
}
public:
void insertBST(int key)
{
rec_insertBST(root,key);
}
};
当我通过引用传递指针以插入函数(&)时,出现此编译错误:
'void BSTree :: rec_insertBST(TNode *&,int)':无法转换 参数1从'TNode *'到'TNode *&'
但是当我删除引用运算符(&)时,它将成功编译。为什么会发生这种情况,如何在这里通过引用传递指针?
即使代码没有意义,我也想对错误进行解释。
解决方法
getLeft
方法返回left
成员变量的副本,因此,即使您的代码已编译,它也不会更改left
。但是,由于不能将引用绑定到临时规则,因此无法编译。
可能有几种解决方案,对我来说最好的解决方案是将getLeft
替换为left
,将getRight
替换为right
。
rec_insertBST(subRoot->right,key);
这将需要更改访问权限或授予友谊。
另一种选择是让getLeft
和getRight
返回引用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。