Работа с шаблонами и ошибками в C ++

0

Я пытаюсь реализовать красное черное дерево с использованием шаблонов. Например, при вставке элемента в дерево ключ и элемент должны быть общими типами. До сих пор я реализовал файл заголовка, который состоит из структуры и функций, которые будут реализованы. Тем не менее, я не знаю, правильно ли я использую шаблоны. Кроме того, когда я попытался реализовать функцию "Вставить", IDE выдаст ошибку: прототип для "void RedBlackTree :: InsertKey (Item * &, Key * &) не соответствует ни одному классу" RedBlackTree RedBlackTree.h "

Это мой заголовочный файл:

#ifndef REDBLACKTREE_H_
#define REDBLACKTREE_H_

template <class Item, class Key>
class RedBlackTree
{
    typedef enum
    {
        BLACK,
        RED
    }ColourNode;

    typedef struct RBT
    {
        struct RBT *left;
        struct RBT *right;
        struct RBT *parent;
        struct RBT *root;
        ColourNode colour;
        Item item;
        Key key;
    }RBTNode;

    public:
        ~RedBlackTree(); // destructor
        RedBlackTree(Item, Key); // default constructor

        void InsertKey(Item, Key);
        int InsertFixUp(Item, Key);
        int RemoveKey(Item, Key);
        int FindKey(Item, Key);

    private:
        RedBlackTree<Item, Key> *rootPointer;
        RedBlackTree<Item, Key> *NILL_LEAF;

};

template <class Item, class Key>
void RedBlackTree<Item, Key>::InsertKey(Item *&T, Key *&z)
{
    //node* nil=tree->nil;
    //node* root=tree->root;
    RBTNode *y;
    RBTNode *x;
    y=T->nil;
    x=T->root;

    while(x != T->nil)
    {
        y=x;
        if((z->key)<(x->key))
            x=x->left;
        else
            x=x->right;
    }

    y=z->parent;

    if(y == T->nil)
        z=T->root;
    else
    if((z->key)<(y->key))
        z=y->left;
    else
        z=y->right;
        z->left=T->nil;
        z->right=T->nil;
        z->colour=RED;
        InsertFixUp(T,z);
}
#endif /* REDBLACKTREE_H_ */

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

  • 0
    Да, это правильный способ использования шаблонов. Ваши прототипы InsertKey действительно не соответствуют. У одного есть Item а у другого Item*& это два совершенно разных типа.
Теги:
tree

2 ответа

1

Проблема в том, что типы аргументов InsertKey не соответствуют объявлению. В объявлении аргументы являются Item и Key, а в реализации - Item*& и Key*& (ссылки на указатели). Они должны соответствовать.

void InsertKey(Item, Key);
               ^^^^  ^^^
void RedBlackTree<Item, Key>::InsertKey(Item *&T, Key *&z)
                                        ^^^^^^^   ^^^^^^
  • 0
    Большое спасибо, это сработало :)
  • 0
    Я пытался создать экземпляр RedBlackTree в моей основной функции, но он не принимает его: RedBlackTree <int, int> t1;
Показать ещё 4 комментария
0

Вы должны перенести реализацию функции (шаблона) в определение класса.

template <class Item, class Key>
class RedBlackTree
{
//...
public:
    ~RedBlackTree(); // destructor
    RedBlackTree(Item, Key); // default constructor

    void InsertKey(Item *&T, Key *&z)
    {
        //...
    }

    //...
};
  • 0
    Я решил проблему. Однако, когда я попробовал это по-вашему, возникло много ошибок
  • 0
    Мое плохое - я думал, что InsertKey() использует другие InsertKey() . Отредактировал пост.

Ещё вопросы

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