Ошибка шаблона C ++ - RBTree

0

Я новичок в шаблонах c++, и мне не удалось исправить эту ошибку. В моем основном методе я создаю дерево экземпляров для Rbt, вызывающего элемент шаблонов и ключ как int. Ошибка, о которой мне говорят, является

нет соответствия для вызова "RBt :: RBt()"

и предупреждающее сообщение, которое я получаю:

RBt :: RBt (Item, Key) [с Item = int; Key = int]

код в моем основном методе:

#include "Nod.h"
#include "RBt.h"
#include <stdlib.h>

int main() {
    Nod <int, int> x = Nod<int, int> (0, 3); // Nod.h

    RBt<int, int> tree;
    tree.Insert(tree, &x);

    return 0;
}

RBt.h:

    #include <stdlib.h>
    #include <stdio.h>
    using namespace std;

    template <class Item, class Key> class RBt
    {
    private:

        Nod<Item, Key> *root;

    public:
        Nod<Item, Key> NIL;

        RBt(Item item, Key key){
            root = 0;
        }
        void Insert(RBt<Item, Key> T, Nod<Item,Key> *z);
    };

template<class Item, class Key> void RBt<Item, Key> ::Insert(RBt<Item, Key> T, Nod<Item,Key> *z)
        {
            Nod<Item, Key> *newNode = NULL;


            if(root->getValue() == z->getValue()){
                //skip doubles
            }
            else if(root->getValue() > z->getValue()){
                if(root->getLeft() == NULL){

                    newNode = z;
                    root->setLeft(newNode);
                }
                else{
                    this->Insert(T,z->getLeft());
                }
            }
            else
            {
                if(root->getRight() ==NULL){

                    newNode =z;
                    root->setRight(newNode);
                }
                else{
                    //this->Insert(root->getRight(),z);
                }
            }

            z->setLeft(newNode);
            z->setRight(newNode);
            z->color = "RED";
            //z-> setColor("RED");
            InsertFixUp(T,z);

        }

Nod.h:

    template <class Item, class Key> class Nod {
    public:
        Nod *left;
        Nod *right;
        Nod *parent;

        int value;
        string color;
        Key key;
        Item item;

        Nod(Item item, Key key){
            this->key = key;
            this->item = item;

        }

void setLeft(Nod<Item, Key> *left){
        this-> left = left;

    }

    Nod<Item, Key> *getLeft(){return this->left;}

    void setRight(Nod<Item, Key> *right){
        this-> right = right;

    }
    Nod<Item, Key> *getRight(){return this->right;}
        void setValue(int value){
        this->value = value;
    }

    int getValue(){ return this->value;}

    void setColor(string color){
        this->color = color;
    }

    string getColor(){return this->color;}
};

Заранее спасибо.

  • 0
    Где ваше определение для Node (или это Nod ... у вас есть оба)?
  • 0
    Я отредактировал вопрос с помощью класса Nod.
Показать ещё 5 комментариев
Теги:

2 ответа

2

Существует только один конструктор, и он принимает аргументы типов Item и Key, которые на основе этой строки: RBt<int, int> tree; , вы указали, что оба являются int. Передайте два ints конструктору следующим образом: RBt<int, int> tree(0,0); , В качестве альтернативы добавьте в RBt.h следующее:

RBt() = default;

для добавления обратно конструктора по умолчанию (который больше не генерируется автоматически, если вы объявляете какой-либо другой конструктор).

Кроме того, в С++ 11 вы можете установить root = nullptr; непосредственно в определении класса - вам не нужно делать это в конструкторе. Предпочитаете nullptr для nullptr указателей на 0. Это яснее, а также избавляет от возможности неопределенной компиляции.

  • 0
    спасибо за ответ, второй вариант, который вы мне дали, не дал никаких ошибок в основном, но я получил эту ошибку - нет соответствующей функции для вызова 'Nod <int, int> :: Nod ()'. И та же ошибка, если я попробую первый вариант.
  • 0
    Конечно, вы пытаетесь использовать конструктор Nod по умолчанию для строки Nod<Item, Key> NIL; , так как нет доступного конструктора по умолчанию, вы сталкиваетесь с той же проблемой. Добавить Nod() = default; в файле Nod.h или в Node() { /* more fancy stuff here */ } если вы хотите другое поведение.
Показать ещё 2 комментария
0

Вам нужен такой конструктор

RBt(){
    root =0;
}
  • 0
    когда я делаю это, я получаю эти ошибки: нет соответствующей функции для вызова 'Nod <int, int> :: Nod ()', и когда я делаю конструктор Nod так же, как и выше, я получаю ошибку в основном, говоря, что нет соответствующей функции для вызова 'Nod <int, int> :: Nod (int, int)'.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню