2017-04-18 9 views
0

以下は、要素をバイナリ検索ツリーに挿入するためのコードです。挿入関数には、ツリーに挿入する数値とツリーのルートであるルートという2つのパラメータがあります。タイプBinaryNode *の非const参照の無効な初期化&

マイroot->getLeft()root->getRight()の両方が、私はそのこのエラーを返すと思ってい理由である、BinaryNode*を返す:

BST.cpp: In function ‘void insert(int, BinaryNode*&)’: 
BST.cpp:72:34: error: invalid initialization of non-const reference of type ‘BinaryNode*&’ from an rvalue of type ‘BinaryNode*’ 

void insert(int value, BinaryNode*& root) { 
     cout << "Looping" << endl; 
     if(root == NULL) { 
     BinaryNode* node = new BinaryNode(value); 
     root = node; 
     cout << "finalized" << endl; 
     cout << "Root value: " << root->getValue() << endl; 
     } 
     else if(value < root->getValue()) { 
      insert(value, root->getLeft()); 
      cout << "went to left" << endl; 
     } 
     else if(value >= root->getValue()) { 
      insert(value, root->getRight()); 
      cout << "went to right" << endl; 
     } 
    } 

正しい値(* &)ように、どのように私はroot->getLeft()を修正するだろうが、渡されましたか?

また、正確には* &とは何ですか?私はBinaryNode*のルートを渡すだけでテストしており、rootへの変更は決して有効ではないようです。 rootはinsert以外の値を忘れてしまい、過去には* &のみが元の実際の値を変更するように働いていたようです。

ありがとうございます!

+1

「さらに、*とは何か?」これはポインタへの参照です。それがあなたにとって理にかなっていない場合は、[C++の良い本を解読する](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)と最初のいくつかの章。 – user4581301

+0

'root-> getLeft()'と 'root-> getRight()'は 'BinaryNode *'を返します。これは他のポインタのコピーです。コピーを更新すると、元のポインタは変更されません。コンパイラは、一時的な(値)を非const参照にバインドすることはできないことに言及することによって、あなたに伝えようとします。 –

答えて

1

これはC++言語でのルールです:You can not bind a r-value to l-value reference

は、この例を考えてみましょう:

// Foo return a r-value 
some_type foo(); 

// binding r-value to l-value reference is not valid 
some_type& var = foo(); 

この例では、割り当てがリターンを表現する際に破壊されますfooからの一時的なオブジェクトを返しており、だから我々はぶら下がった参照を持つだろう。このため、r値をl値参照にバインドすることはできません。

root->getLeft()のコードでは、BinaryNode*タイプのr値を返し、それをl値の参照であるBinaryNode*&にバインドしています。

あなたがそのエラーをバイパスすることができたとしても、あなたのコードに問題があります。そして、あなたのinsert機能であなたはそれがBinaryNode*& rootパラメータのヴィア一時的なポインタを変更している、一時的な変数であるポインタを返すroot->getLeft()。ノードポインタ(BinaryNode*&)への参照をgetLeft()getRight()から戻す必要があります。

+0

よく説明された答えをありがとう! –

関連する問題