C++ 将模板与C++;

C++ 将模板与C++;,c++,templates,C++,Templates,我正在尝试使用模板实现一个红黑树。insert函数采用两种通用类型,Item和Key。但是,当我在main()中创建RedBlackTree的实例并调用函数“InsertKey”时,程序会给出错误:无法解析方法“InsertKey”。另外,我不知道在'InsertKey'函数中作为参数传递什么。我实现了一个由随机元素组成的数组。数组应该是其中一个参数,但我不知道另一个参数是什么 这是我的头文件: #ifndef REDBLACKTREE_H_ #define REDBLACKTREE_H_ t

我正在尝试使用模板实现一个红黑树。insert函数采用两种通用类型,Item和Key。但是,当我在main()中创建RedBlackTree的实例并调用函数“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_ */
\ifndef REDBLACKTREE\u H_
#定义红黑树_
模板
类红黑树
{
类型定义枚举
{
黑色
红色
}染色结节;
/*存储在树中的用户数据*/
类型定义结构{
int数据;
}特雷达;
类型定义结构RBT
{
结构RBT*左;
结构RBT*右;
结构RBT*父级;
结构RBT*根;
颜色节点颜色;
//项目;
钥匙;
树数据;
}RBTNode;
公众:
~RedBlackTree();//析构函数
RedBlackTree(项,键);//默认构造函数
无效插入键(常数项*&,常数键*&);
无效固定插入(固定项目*&,固定键*&);
int RemoveKey(项,键);
int FindKey(项目、关键);
//私人:
//红黑树*根指针;
};
#endif/*REDBLACKTREE_H_*/
这是我的主要任务

#包括
#包括
#包括
#包括
#包括
#包括“RedBlackTree.h”
使用名称空间std;
int main(int argc,const char*argv[]
{
常数int arraysize=200;
int-arr[arraysize];
红黑树t1(int,int);
srand((未签名)时间(0));
对于(int i=0;i
然后,您可以创建这种类型的对象,如下所示:

RedBlackTree<int, int> t1;
redblacktreet1;
你永远不会在像
(int,int)这样的普通主题之间传递类型
。它们总是在尖括号之间,比如
和模板名称之后。在这种情况下,模板名称是
RedBlackTree
,我们想用
int
类型实例化它,所以我们做
RedBlackTree
。没有什么可以传递给构造函数

然后,您可以创建这种类型的对象,如下所示:

RedBlackTree<int, int> t1;
redblacktreet1;

你永远不会在像
(int,int)这样的普通主题之间传递类型
。它们总是在尖括号之间,比如
和模板名称之后。在这种情况下,模板名称是
RedBlackTree
,我们希望用
int
类型实例化它,所以我们使用
RedBlackTree
。没有什么可以传递给构造函数。

您向用户承诺了一个函数
InsertKey()
需要两个指针。您试图用一个值来调用
InsertKey()
。这是行不通的


作为一般建议,在将数据结构转换为模板之前,请确保它与具体类型一起工作(对于算法来说,这是另一种方式)。我还建议您
RedBlackTree
使用
K
V
对象,而不是使用指针。如果用户确实想使用指针,可以通过指定指针参数来使用类模板。

您向用户承诺了一个函数
InsertKey()
它需要两个指针。您试图用一个值调用
InsertKey()
。这是行不通的

RedBlackTree() {  }
作为一般建议,在将数据结构转换为模板之前,请确保它与具体类型一起工作(对于算法来说,这是另一种方式)。我还建议您使用
RedBlackTree
K
V
对象而不是使用指针。如果用户确实希望使用指针,则可以通过指定指针参数来使用类模板。

RedBlackTree t1(int,int);
被视为函数声明。您尚未为
RedBlackTree
定义默认构造函数,因此必须提供一个构造函数,或者使用参数构造对象

RedBlackTree() {  }
下一个问题是
InsertKey
的函数签名需要两个参数,而您只给它一个参数

void InsertKey(const Item *&, const Key *&);
t1.InsertKey(arr[i], /* something else must go here */)
除此之外,当函数需要
int*&
时,您正在传递一个
int
。如果您想通过常量引用传递这些参数,请删除星号

void InsertKey(const Item &, const Key &);
否则,您需要传递一个指针

t1.InsertKey(&arr[i], /* something else */);
问题是它需要一个
常量
指针,因此您必须执行以下操作:

const int* pointer = &arr[i];
t1.InsertKey(pointer, /* something else */);
RedBlackTree t1(int,int);
被视为函数声明。您尚未为
RedBlackTree
定义默认构造函数,因此必须提供一个构造函数,或使用参数构造对象

RedBlackTree() {  }
下一个问题是
InsertKey
的函数签名需要两个参数,而您只给它一个参数

void InsertKey(const Item *&, const Key *&);
t1.InsertKey(arr[i], /* something else must go here */)
除此之外,当函数需要
int*&
时,您正在传递一个
int
。如果您想通过常量引用传递这些参数,请删除星号

void InsertKey(const Item &, const Key &);
否则,您需要传递一个指针

t1.InsertKey(&arr[i], /* something else */);
问题是它需要一个
常量
指针,因此您必须执行以下操作:

const int* pointer = &arr[i];
t1.InsertKey(pointer, /* something else */);

typedef是不必要的。只需定义,例如,
struct tree data{int data;};
typedef是不必要的。只需定义,例如,
struct tree data{int data;}
这既不是烦人的解析,也不是最烦人的解析。这只是一个简单的函数声明。@sftrabbit好的,我从答案中删除了这一部分。谢谢。由于我不知道要在红黑树中添加元素需要传递什么,有什么建议吗?这既不是烦人的解析,也不是最烦人的解析解析。这只是一个简单的函数声明。@好的,我从答案中删除了这一部分。谢谢。有什么建议吗