1

コンパイル時に上記のエラー メッセージが 2 回表示されます。他のすべては正常に動作します。つまり、他のコンパイル時エラーはありません。これは単純なバイナリ ツリー プログラムであり、エラーが発生している関数は、単にすべてのサブツリーを交換するためのスワップまたはミラー関数です。ここに関数があります

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;
   }
}

これがメインの関数呼び出しです(これは、左辺値以外の2つのエラーが発生する場所です

swapSubTrees (b1);

b1 はクラス BinaryTree からインスタンス化されたオブジェクトで、ツリーの一番上にあります。ツリーの他のノードである対応するオブジェクト b2、b3、b4、および b5 があり、明らかに私が省略したコードからわかります。とにかく、どこが間違っていたのかを見つけることができないようです。何が原因でしょうか? どんな助けでも大歓迎です!左の関数は次のようになります

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

4 に答える 4

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();
}

次に、 free-function を単に次のように変更します。

template <class dataType>
void swapSubTrees ( BinaryTree <dataType> * bt )
{
    if(bt != NULL)
        bt->swapChildren();
}
于 2013-10-30T10:14:37.953 に答える
1

追加

void setLeft( BinaryTree <dataType> * other );

void setRight( BinaryTree <dataType> * other );

あなたの BinaryTree クラスに、まだ存在しないと仮定します (それらの実装はあなたに任せます!)

次に、エラー行を次のように変更します

bt->setLeft( bt->right() );
bt->setRight( temp );
于 2013-10-30T10:30:18.113 に答える
0

ここでの問題は、 に値を代入しようとしていることですrvalue

基本的に、原因はleftandによって返される値rightが一時的なオブジェクトであることです。ポインターのコピーを返していますが、このコピーを割り当てることはできません。

これをコンパイルする方法は、leftおよびright関数を変更して、割り当て可能なポインターへの参照を返すことです。これは次のように行われます。

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

(同様にright)

アスタリスク (*) の後のアンパサンド (&) に注意してください。これは、戻り値が参照であることを意味します。これは、値による戻りではなく、参照による戻りと呼ばれます。

これにより、コードがコンパイルされます。しかし、これが本当にあなたが望むものかどうかを自問する必要があります。leftTree外部の誰かが内部のポイントを変更できるようにしBinaryTreeますか?

より良いオプションは、これら 2 つのセッター関数を追加し、代わりにこれらを呼び出すことです。

于 2013-10-30T10:27:55.050 に答える
-1

関数 left() と right() をポインターへの参照を返すように書き直す場合、問題はありません。:)

于 2013-10-30T10:18:29.307 に答える