2015-05-17 4 views
1

Это является AVL Tree C++ программа и имеет следующие ресурсы:ошибка C2661: «узел :: узел»: не перегруженная функция принимает 3 аргумента

"TreeNode.h" 
"AVLTree.h" 
"AVLTree.cpp" 
"Main.cpp" 

Я добавил «TreeNode.cpp» и принял функция «узел :: узел» от «AVLTree.cpp» и поместить его в «TreeNod.cpp», включали в себя «TreeNode.h» и после компиляции, VS 2013 бросает меня ошибка C2661 для линии:

n = new node(x, NULL, NULL); 

Функция, соответствующая ошибке в «AVLTree.cpp»:

void tree::insert(int x, node* &n) 
{ 
    if (n == NULL) 
     n = new node(x, NULL, NULL); 

    else if (x < n->data) 
    { 
     insert(x, n->l); 
     if (n->l != NULL && n->r != NULL && n->l->height - n->r->height == 2) 
     { 
      if (x < n->l->data) 
       rightrotation(n); 
      else 
       doublerotation_leftright(n); 
     } 
    } 
    else if (x > n->data) 
    { 
     insert(x, n->r); 
     if (n->r != NULL && n->l != NULL && n->r->height - n->l->height == 2) 
     { 
      if (n->r->data < x) 
       leftrotation(n); 
      else 
       doublerotation_leftright(n); 
     } 
    } 
    n->height = maxi(n->l, n->r) + 1; 
} 

"TreeNode.cpp":

#include "TreeNode.h" 

node::node(int x, node *newleft, node *newright, int h = 0) 
{ 
    data = x; 
    l = newleft; 
    r = newright; 
    height = h; 
} 

"AVLTree.h":

#include "TreeNode.h" 

#pragma once 

class tree 
{ 
    public: 
    tree(); 
    ~tree(); 
    void insert(int x); 
    bool pop(int n); 
    void printpostorder(); 
    void printlevelorder(); 

    private: 
    node* head; 
    node* nullnode; 

    void destruct(node* n); 
    node* findnode(int n); 
    node* min(node* n); 
    node* Bfind(int n); 

    void rightrotation(node* &k2); 
    void leftrotation(node* &k2); 
    void doublerotation_leftright(node* &k3); 
    void postorder(node* n); 
    void levelorder(node* n); 
    void insert(int x, node* &n); 
    int maxi(node *x1, node *x2); 
    void balance(node* &n); 
}; 

Где проблема?

Edit 1:

"TreeNode.h" 

#pragma once 

class node 
{ 
public: 
    int data; 
    node* l; 
    node* r; 
    int height; 
    node(int x, node* newleft, node* newright, int h); 
}; 
+0

Показать 'TreeNode.h'. –

+0

добавлен в конец сообщения ... – Bahador

+0

Я добавил «0» к аргументам, и код был скомпилирован без ошибок! 'n = новый узел (x, NULL, NULL, 0);' не уверен, что то, что я сделал, имеет смысл! – Bahador

ответ

2

кажется, что в определении класса узла соответствующий конструктор не имеет аргумент по умолчанию для четвертого параметра. Проверьте определение класса и укажите аргумент по умолчанию в объявлении конструктора в определении класса вместо определения конструктора в файле cpp.

Учтите, что вместо аргумента по умолчанию вы можете использовать перегруженные делегированные конструкторы. Например

class node 
{ 
public: 
    node(int x, node *newleft, node *newright); 
    node(int x, node *newleft, node *newright, int h); 
    //... 

//,,, 

node::node(int x, node *newleft, node *newright) : node(x, newleft, newright, 0) 
{ 
} 
0

AVLTree.cpp не может видеть TreeNode.cpp, поэтому она не имеет ни малейшего представления о том, что четвертый параметр node «s конструктора является необязательным.

Поместите параметр по умолчанию в декларацию, а не в определение, чтобы он отображался в каждой единицы перевода, которая использует заголовок.