我在编译期间收到上述错误消息两次。其他一切正常,但没有其他编译时错误。这是一个简单的二叉树程序,错误来自的函数是交换或镜像函数,旨在简单地交换所有子树。这是函数
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;
}
答案 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
分配值。
基本上,原因是left
和right
返回的值是临时对象。您将返回指针的副本,并且无法将此副本分配给。
将其编译的方法是更改left
和right
函数以返回对指针的引用,该引用可以分配给。这样做如下:
Template <class dataType>
BinaryTree <dataType>*& BinaryTree<dataType> :: left()
{
return leftTree;
}
(同样适用于right
)
注意星号(*)后面的&符号(&amp;)。这意味着返回的值是一个引用。这称为通过引用返回,而不是按值返回。
现在,这会导致代码编译。但你真的应该问问自己这是不是你想要的。您是否希望允许来自外部的人更改leftTree
内BinaryTree
指向的内容?
更好的选择可能是为这两个添加一个setter函数,而是调用它们。
答案 3 :(得分:-1)
如果您将函数left()和right()重写为返回对指针的引用,则不会出现问题。:)