Yak*_*kov 0 c++ pointers return-value
我有以下.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);
};
Run Code Online (Sandbox Code Playgroud)
实施时,出现错误-什么地方出了问题以及如何解决
'&'需要l值
地址运算符(&)必须具有一个l值作为操作数。
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())
{
}
}
Run Code Online (Sandbox Code Playgroud)
令我惊讶的是,我无法找到所问问题的一个很好的副本(尽管有其他问题)。
您看到的错误来自以下代码:
&((*root)->getLeft())
Run Code Online (Sandbox Code Playgroud)
并可以大大简化为以下几小段:
int bar();
void foo(int*);
void baz() {
foo(&bar());
}
Run Code Online (Sandbox Code Playgroud)
(也可以在https://gcc.godbolt.org/z/PuwtuT上看到)
这将产生完全相同的编译器错误。这样做的原因是C ++禁止使用prvalue的地址,尽管整个rvalue / lvalue的讨论非常复杂,但很容易记住,当函数返回值时,它始终是prvalue。(如果函数返回引用,则情况有所不同)。但是,您可以通过const或rvalue引用传递右值。
我无法立即为您的问题提供解决方案,因为我不清楚您的最终目标是什么。但我确实希望这个答案至少可以引导您的想法,并让您提出另一个问题。