尝试通过referene传递指针时获取此错误

时间:2016-02-27 22:30:14

标签: c++ compiler-errors

我试图在BST中创建一个删除节点函数,我需要通过引用传递一个指针,这样我就可以更改指针,但是我一直收到这个错误:

'void Tree :: deletNode(T,Node *&)':无法将参数2从'Node *'转换为'Node *&'

有两个这样的错误,它们在递归调用自身时发生在deletNode中。

当我没有&但它没有按预期工作。

这是我的2个函数,它们应该删除BST中的节点。 树的根ptr称为root,Node是节点类型。 此外,调用deletNode函数调用makedelete。但用户调用deletNode

    void deletNode(T num, Node<T> *& nodeptr)
{
    if (num < nodeptr->getData())
        deletNode(num, nodeptr->getLeft());
    else if (num > nodeptr->getData())
        deletNode(num, nodeptr->getRight());
    else
    {
        cout << "called makedelete on " << nodeptr << "which has " << nodeptr->getData() << endl;
        makedelete(nodeptr);
    }
}

void makedelete(Node<T> *& nodeptr)
{
    Node<T> * tempnode;

    if (nodeptr == nullptr)
        cout << "error..." << endl;
    else if (nodeptr->getRight() == nullptr)
    {
        tempnode = nodeptr;
        nodeptr = nodeptr->getLeft();
        delete tempnode;
    }
    else if (nodeptr->getLeft() == nullptr)
    {
        tempnode = nodeptr;
        nodeptr = nodeptr->getRight();
        delete tempnode;
    }
    else //has 2 kids
    {
        tempnode = nodeptr->getRight(); ///move 1 node to right

        while (tempnode->getLeft()) // go to end of left
        {
            tempnode = tempnode->getLeft();
        }

        tempnode->setLeft(nodeptr->getLeft());
        tempnode = nodeptr;
        nodeptr = nodeptr->getRight();
        delete tempnode;

    }
}

};

这是Node类:

template <typename T>
class Node
{
    T data;
    Node* left;
    Node* right;
public:
    T getData() { return data; }
    Node<T>* getLeft() { return left; }
    Node<T>* getRight() { return right; }
    void setData(T t) { data = t; }
    void setLeft(Node<T>* pLeft) { left = pLeft; }
    void setRight(Node<T>* pRight) { right = pRight; }
};

2 个答案:

答案 0 :(得分:2)

Node<T>* getLeft() { return left; }

按值返回。所以返回的Node<T>*是暂时的。请注意,因为您返回left 而不是对left的引用或指向left的引用,您无法修改left通过调用getLeft

void deletNode(T num, Node<T> *& nodeptr)

这需要对Node<T>*进行非const引用。

    deletNode(num, nodeptr->getLeft());

在这里,您尝试在deletNode返回的临时值上调用getLeft。但是你不能将非const引用绑定到临时引用。您不能通过返回left来修改getLeft,因为它既不返回引用也不返回指针。

修复取决于你真正想做的事情,但绝对不要试图将临时文件传递给采用非const引用的函数。您是否期望拨打deletNode来修改nodeptr->left?如果是这样,getLeft需要返回引用。

答案 1 :(得分:0)

nodeptr-&gt; getLeft()或nodeptr-&gt; getRight()会导致rvalue,并且您试图保持rvalue的引用是错误的。它在deletNode ..

在将它传递给deletNode之前,请执行此操作

Service<T,U,V>

你可以在c ++ 11中保存对rvalue的引用,为此,将deletNode的签名更改为

Node<int>* tmp = node->getLeft();
deletNode(tmp);