2017-12-07 3 views
-1

私は現在、単純なBTREEを実装するが、ここで問題に遭遇しているように見えるしようとしています...私にエラーメッセージ与えエラー:削除された機能の使用?

#include <iostream> 
#include <cstdlib> 
#include <vector> 
#include <algorithm> 

struct element 
{ 
    int x; 
    int y; 
    element (int x, int y) 
    { 
     this->x = x; 
     this->y = y; 
    } 
}; 

int sum(element key) 
{ 
    return key.x + key.y; 
} 

struct node 
{ 
    element key; 
    node *child_left; 
    node *child_right; 
}; 


class tree{ 

    void insert(element key); 
    void insert(element key, node* leaf); 
    node* root; 
    tree() 
    { 
     this->root = NULL; 
    } 
}; 

void tree::insert(element key){ 
    if(this->root != NULL){ 
     insert(key, this->root); 
    }else{ 
     this->root = new node; 
     this->root->key.x = key.x; 
     this->root->key.y = key.y; 
     this->root->child_left = NULL; 
     this->root->child_right = NULL; 



    } 
} 


void tree::insert(element key, node* leaf){ 
    if(sum(key) < sum(leaf->key)){ 
     if(leaf->child_left != NULL){ 
      insert(key, leaf->child_left); 
     }else{ 
      leaf->child_left = new node; 
      leaf->child_left->key.x = key.x; 
      leaf->child_left->key.y = key.y; 
      leaf->child_left->child_left = NULL; 
      leaf->child_left->child_right = NULL; 
     } 
    }else if(sum(key) >= sum(leaf->key)){ 
     if(leaf->child_right != NULL){ 
      insert(key, leaf->child_right); 
     }else{ 
      leaf->child_right = new node; 
      leaf->child_right->key.x = key.x; 
      leaf->child_right->key.y = key.y; 
      leaf->child_right->child_left = NULL; 
      leaf->child_right->child_right = NULL; 
     } 
    } 
} 

int main() 
{ 

    std::cout << "Somet"<< std::endl; 

} 

https://wandbox.org/permlink/0InxxBLt59PFVppt

:私は

Start 
prog.cc: In member function 'void tree::insert(element)': 
prog.cc:49:20: error: use of deleted function 'node::node()' 
    this->root = new node; 
        ^~~~ 
prog.cc:26:8: note: 'node::node()' is implicitly deleted because the default definition would be ill-formed: 
struct node 
     ^~~~ 
prog.cc:26:8: error: no matching function for call to 'element::element()' 
prog.cc:14:5: note: candidate: 'element::element(int, int)' 
    element (int x, int y) 
    ^~~~~~~ 
prog.cc:14:5: note: candidate expects 2 arguments, 0 provided 
prog.cc:10:8: note: candidate: 'constexpr element::element(const element&)' 
struct element 
     ^~~~~~~ 
prog.cc:10:8: note: candidate expects 1 argument, 0 provided 
prog.cc:10:8: note: candidate: 'constexpr element::element(element&&)' 
prog.cc:10:8: note: candidate expects 1 argument, 0 provided 
prog.cc: In member function 'void tree::insert(element, node*)': 
prog.cc:66:28: error: use of deleted function 'node::node()' 
    leaf->child_left = new node; 
          ^~~~ 
prog.cc:76:28: error: use of deleted function 'node::node()' 
    leaf->child_right = new node; 
          ^~~~ 
1 
Finish 

をなぜこれが問題を引き起こしているのかわかりません...だから、いくつかの説明は理解できます。構造体(およびクラス)自体がデフォルトのコンストラクタを持っていますか?それで、なぜそれは不平を言うのですか?

+0

@George私は尋ねてくれて申し訳ありません。それ。 私はC++の部分で少し錆びていますが、このような単純なものは私を多く混乱させるようです。 – Loser

+0

とにかくtobiの回答があるので、コメントを削除しました。基本的に 'element'のために存在する唯一のコンストラクタは' element :: element(int、int) 'です。もしあなたがctorを与えていなければ、C++はあなたのために' element :: element() 'をマークします。 'node'を作成すると、' element'のデフォルトctorを使って 'element'を作成しようとしています。これは存在しないので、コードは不正です。 – George

答えて

1

elementはどれも(エラーメッセージはあなたを教えしようとしているところでまさにザッツを;)がないのでnodeのデフォルトコンストラクタは、削除されます。 elementのコンパイラ生成デフォルトコンストラクタはありません。独自のコンストラクタを用意しています(デフォルトのコンストラクタではない、つまり引数なしで呼び出すことはできません)。

node() : key(element(1,2)) {} 

又はelementための1:elementコンストラクタにパラメータを渡すnodeのデフォルトコンストラクタ書き込みのいずれか後者の場合

element(int x=0,int y=0) : x(x),y(y) {} 

node缶のデフォルトコンストラクタによって生成されますコンパイラはこれが本当にちょうどこれだから:

node() {} 
関連する問題