首页 > 解决方案 > 指针返回值地址

问题描述

我有以下 .h 文件

class Node
{
private :
    int m_data;
    Node* m_left;
    Node* m_right;
public:
    Node(int data) : m_data(data), m_left(nullptr), m_right(nullptr) {}
    Node* getLeft() { return m_left; }
    Node* getRight() { return m_right;  }
    int getData() { return m_data;  }
};

class Tree
{
private :
    Node * m_root;
    unsigned int m_size;
    void freeNode(Node*);
    bool insert(Node**, int );
public:
    Tree() : m_size(0) {}
    ~Tree();
    int findMaximumVericalSum();
    bool insert(int);
};

实施,我得到一个错误 - 什么是错的,我应该如何解决它

'&' 需要左值

地址运算符 ( & ) 必须有一个左值作为操作数。

bool Tree::insert(Node** root, int data)
{
    Node* newNode = new Node(data);
    if (*root == nullptr) {
        *root = new Node(data);
    }
    else if (data < (*root)->getLeft()->getData())
    {
        // error '&' requires l-value
        insert(&((*root)->getLeft()), data);
    }
    else if (data > (*root)->getLeft()->getData())
    {

    }
}

标签: c++pointersreturn-value

解决方案


令我惊讶的是,我无法为所问的问题找到一个好的副本(尽管有其他问题)。

您看到的错误来自以下代码:

&((*root)->getLeft())

并且可以大大简化为以下一小部分:

int bar();
void foo(int*);

void baz() {
    foo(&bar());
}

(也可以在https://gcc.godbolt.org/z/PuwtuT上看到)

这会产生完全相同的编译器错误。原因是 C++ 禁止获取纯右值的地址,虽然整个右值/左值讨论非常复杂,但很容易记住,当函数返回一个值时,它始终是纯右值。(如果函数返回一个引用,这是一个不同的故事)。但是,您可以通过 const 或右值引用传递右值。

我不能立即为您的问题提供解决方案,因为我不太清楚您的最终目标是什么。但我确实希望这个答案至少可以引导您的想法并让您提出另一个问题。


推荐阅读