赋值错误中的非左值

时间:2013-10-30 10:10:55

标签: c++ tree binary-tree

我在编译期间收到上述错误消息两次。其他一切正常,但没有其他编译时错误。这是一个简单的二叉树程序,错误来自的函数是交换或镜像函数,旨在简单地交换所有子树。这是函数

template <class dataType>
void swapSubTrees ( BinaryTree <dataType> * bt )
{
    if(bt == NULL)
    {
        //do nothing  
    }
    else
    {  
        swapSubTrees(bt->left());
        swapSubTrees(bt->right());
        BinaryTree <int> *temp;
        temp = bt->left();
        bt->left() = bt->right();
        bt->right() = temp;
   }
}

这是我在main中的函数调用(这是我得到两个非左值错误的地方

swapSubTrees (b1);

b1是一个从BinaryTree类实例化的对象,它位于我的树顶部。有相应的对象b2,b3,b4和b5是树的其他节点,显然是我遗漏的代码。 无论如何,我似乎无法找到我出错的地方,它会是什么?任何帮助都会非常感谢! 左边的功能看起来像

Template <class dataType>
BinaryTree <dataType> * BinaryTree<dataType> :: left()
{
    return leftTree;
}

4 个答案:

答案 0 :(得分:4)

我猜测给出错误的行是:

bt->left() = bt->right();
bt->right() = temp;

您不能将这样的函数调用用作表达式的左侧。


将此方法添加到BinaryTree模板类:

template<class dataType>
void BinaryTree<dataType>::swapChildren()
{
    BinaryTree *tmp = leftTree;
    leftTree = rightTree;
    rightTree = tmp;

    if (leftTree)
        leftTree->swapChildren();
    if (rightTree)
        rightTree->swapChildren();
}

然后将您的自由功能改为:

template <class dataType>
void swapSubTrees ( BinaryTree <dataType> * bt )
{
    if(bt != NULL)
        bt->swapChildren();
}

答案 1 :(得分:1)

添加

void setLeft( BinaryTree <dataType> * other );

void setRight( BinaryTree <dataType> * other );

到你的BinaryTree类,假设它们还不存在(我将把这些实现留给你!)

然后将错误行更改为

bt->setLeft( bt->right() );
bt->setRight( temp );

答案 2 :(得分:0)

这里的问题是您正在尝试为rvalue分配值。

基本上,原因是leftright返回的值是临时对象。您将返回指针的副本,并且无法将此副本分配给。

将其编译的方法是更改​​leftright函数以返回对指针的引用,该引用可以分配给。这样做如下:

Template <class dataType>
BinaryTree <dataType>*& BinaryTree<dataType> :: left()
{
    return leftTree;
}

(同样适用于right

注意星号(*)后面的&符号(&amp;)。这意味着返回的值是一个引用。这称为通过引用返回,而不是按值返回。

现在,这会导致代码编译。但你真的应该问问自己这是不是你想要的。您是否希望允许来自外部的人更改leftTreeBinaryTree指向的内容?

更好的选择可能是为这两个添加一个setter函数,而是调用它们。

答案 3 :(得分:-1)

如果您将函数left()和right()重写为返回对指针的引用,则不会出现问题。:)