Я новичок в шаблонах 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;}
};
Заранее спасибо.
Существует только один конструктор, и он принимает аргументы типов Item
и Key
, которые на основе этой строки: RBt<int, int> tree;
, вы указали, что оба являются int
. Передайте два ints конструктору следующим образом: RBt<int, int> tree(0,0);
, В качестве альтернативы добавьте в RBt.h следующее:
RBt() = default;
для добавления обратно конструктора по умолчанию (который больше не генерируется автоматически, если вы объявляете какой-либо другой конструктор).
Кроме того, в С++ 11 вы можете установить root = nullptr;
непосредственно в определении класса - вам не нужно делать это в конструкторе. Предпочитаете nullptr
для nullptr
указателей на 0. Это яснее, а также избавляет от возможности неопределенной компиляции.
Nod
по умолчанию для строки Nod<Item, Key> NIL;
, так как нет доступного конструктора по умолчанию, вы сталкиваетесь с той же проблемой. Добавить Nod() = default;
в файле Nod.h или в Node() { /* more fancy stuff here */ }
если вы хотите другое поведение.
Вам нужен такой конструктор
RBt(){
root =0;
}