Я пытаюсь реализовать красное черное дерево с использованием шаблонов. Функция вставки имеет два общих типа: Item и Key. Однако, когда я создаю экземпляр RedBlackTree в main() и вызывая функцию "InsertKey", программа выдает ошибку: метод "InsertKey" не может быть разрешен. Кроме того, я не знаю, что передать в качестве аргументов в функции "InsertKey". Я реализовал массив, состоящий из случайных элементов. Массив должен быть одним из параметров, но я не могу понять, что является другим параметром.
Это мой заголовочный файл:
#ifndef REDBLACKTREE_H_
#define REDBLACKTREE_H_
template <class Item, class Key>
class RedBlackTree
{
typedef enum
{
BLACK,
RED
}ColourNode;
/* user data stored in tree */
typedef struct {
int data;
} treedata;
typedef struct RBT
{
struct RBT *left;
struct RBT *right;
struct RBT *parent;
struct RBT *root;
ColourNode colour;
//Item item;
Key key;
treedata data;
}RBTNode;
public:
~RedBlackTree(); // destructor
RedBlackTree(Item, Key); // default constructor
void InsertKey(const Item *&, const Key *&);
void FixingInsert(const Item *&, const Key *&);
int RemoveKey(Item, Key);
int FindKey(Item, Key);
//private:
//RedBlackTree<Item, Key> *rootPointer;
};
#endif /* REDBLACKTREE_H_ */
Это мой основной()
#include <iostream>
#include <string>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include "RedBlackTree.h"
using namespace std;
int main(int argc, const char* argv[])
{
const int arraysize = 200;
int arr[arraysize];
RedBlackTree<int, int> t1(int, int);
srand((unsigned)time(0));
for(int i = 0; i <= arraysize-1; i++)
{
arr[i] = rand() % 210;
//printf("%d ", arr[i]);
}
for(int i = 0; i <= arraysize-1; i++)
{
t1.InsertKey(arr[i], // something else//); //InsertKey should have another parameter, but for now I am trying to figure out why it cannot be resolved.
}
}
Кроме того, какие-то идеи о том, что может быть что-то еще? Я не могу понять, что пройти.
RedBlackTree<int, int> t1(int, int);
Здесь вы объявляете функцию t1
которая возвращает RedBlackTree<int, int>
и принимает два аргумента как типа int
.
Я думаю, вы действительно хотите создать объект RedBlackTree<int, int>
и называть его t1
. Он имеет один конструктор, который берет Item
и Key
. Однако вы прокомментировали это, указав его конструктором по умолчанию, которого нет. Конструктор по умолчанию - это тот, который не принимает аргументов. Я думаю, вы хотели объявить конструктор следующим образом:
RedBlackTree(); // default constructor
Затем вы можете создать объект такого типа следующим образом:
RedBlackTree<int, int> t1;
Вы никогда не пропускаете типы между обычными скобками типа (int, int)
. Они всегда идут между угловыми скобками, такими как <int, int>
и после имени шаблона. В этом случае имя шаблона - RedBlackTree
и мы хотим создать его с помощью типов int
, поэтому мы делаем RedBlackTree<int, int>
. Ничего не перейдет к конструктору.
RedBlackTree<int, int> t1(int, int);
рассматривается как объявление функции. Вы не определили конструктор по умолчанию для своего RedBlackTree
, поэтому вы должны либо предоставить его, либо построить свой объект с аргументами.
RedBlackTree() { }
Следующая проблема заключается в том, что ваша сигнатура функции для InsertKey
ожидает два аргумента, когда вы их только даете.
void InsertKey(const Item *&, const Key *&);
t1.InsertKey(arr[i], /* something else must go here */)
Кроме того, вы передаете int
когда ваша функция ожидает int *&
. Если вы хотите передать эти аргументы с помощью ссылки на const, удалите звездочку.
void InsertKey(const Item &, const Key &);
В противном случае вам нужно передать указатель.
t1.InsertKey(&arr[i], /* something else */);
Проблема в том, что он ожидает указателя const
, поэтому вам нужно будет сделать что-то вроде этого:
const int* pointer = &arr[i];
t1.InsertKey(pointer, /* something else */);
Вы пообещали пользователю функцию InsertKey()
которая принимает два указателя. InsertKey()
вы попытались вызвать InsertKey()
с одним значением. Это не полетит.
В качестве общей рекомендации убедитесь, что ваша структура данных работает с конкретным типом, прежде чем превращать ее в шаблон (для алгоритмов это наоборот). Я также рекомендовал бы, чтобы вы RedBlackTree<K, V>
путешествовали с точки зрения объектов K
и V
а не с помощью указателей. Если использование действительно хочет использовать указатель, шаблон шаблона можно использовать, указав аргументы указателя.
struct tree data { int data; };