调用函数时,引用非常量的初始值必须是左值

initial value of reference to non-const must be an lvalue when calling a function

本文关键字:函数 引用 常量 非常 调用      更新时间:2023-10-16

我像这样识别二叉树:

class Btree
{
public:
    BtreeNode <T>* root;
    ...
}

然后我在二叉树类中编写一个插入函数,如下所示:

void Btree<T>::InsertNode2(T data, BtreeNode <T>* &root)
{
    if (root==NULL)
    {
        root = new BtreeNode <T> (data);
        //cout << root->data << endl;
        return ;
    }
    if (data <= root->data)
        InsertNode2(data, root->leftchild);
    else
        InsertNode2(data, root->rightchild);
}

当我调用此函数时:

Btree<int> *tree=new Btree<int>();
tree->InsertNode2(1, tree->root);

没事。一切都很好。

但是如果我编写另一个函数来获取 root:

BtreeNode <T>* GetRoot(){ return this->root; }

当我调用 InsertNode2 时:

Btree<int> *tree=new Btree<int>();
tree->InsertNode2(1, tree->GetRoot());

有一个错误:引用非常量的初始值必须是左值。这两种方法有什么区别?如何修改?我希望根是私有的。

按值而不是按引用获取 BtreeNode 指针。例如

void Btree<T>::InsertNode2(T data, BtreeNode <T>* root)

这应该可以解决您的问题。

您的InsertNode2函数是树的私有细节。您的树应具有公共插入接口,如下所示:

class Btree
{
    BtreeNode <T>* root;
public:
    void Insert(const T& data) { InsertNode2(data, root); }
    // ...
};

当然,树根也应该是树的私人细节。

您的GetRoot函数返回根指针的副本,当然尝试修改副本是没有意义的。您可能甚至不应该拥有GetRoot函数,因为请参见上文。