Использование шаблонов с C ++

0

Я пытаюсь реализовать красное черное дерево с использованием шаблонов. Функция вставки имеет два общих типа: 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. 
    }

}

Кроме того, какие-то идеи о том, что может быть что-то еще? Я не могу понять, что пройти.

  • 1
    Typedefs не нужны. Просто определите, например, struct tree data { int data; };
Теги:
templates

3 ответа

3
Лучший ответ
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>. Ничего не перейдет к конструктору.

  • 0
    Большое спасибо. У вас есть представление о том, что я могу передать в качестве другого аргумента в функции InsertKey, поскольку я не могу понять, что передать, чтобы добавить элементы в красное черное дерево?
1

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 */);
  • 0
    Это не неприятный анализ и не самый неприятный анализ. Это просто прямое объявление функции.
  • 0
    @sftrabbit Хорошо, я удалил эту часть из ответа.
Показать ещё 1 комментарий
0

Вы пообещали пользователю функцию InsertKey() которая принимает два указателя. InsertKey() вы попытались вызвать InsertKey() с одним значением. Это не полетит.

В качестве общей рекомендации убедитесь, что ваша структура данных работает с конкретным типом, прежде чем превращать ее в шаблон (для алгоритмов это наоборот). Я также рекомендовал бы, чтобы вы RedBlackTree<K, V> путешествовали с точки зрения объектов K и V а не с помощью указателей. Если использование действительно хочет использовать указатель, шаблон шаблона можно использовать, указав аргументы указателя.

Ещё вопросы

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