C++ 将模板与C++;
我正在尝试使用模板实现一个红黑树。insert函数采用两种通用类型,Item和Key。但是,当我在main()中创建RedBlackTree的实例并调用函数“InsertKey”时,程序会给出错误:无法解析方法“InsertKey”。另外,我不知道在'InsertKey'函数中作为参数传递什么。我实现了一个由随机元素组成的数组。数组应该是其中一个参数,但我不知道另一个参数是什么 这是我的头文件:C++ 将模板与C++;,c++,templates,C++,Templates,我正在尝试使用模板实现一个红黑树。insert函数采用两种通用类型,Item和Key。但是,当我在main()中创建RedBlackTree的实例并调用函数“InsertKey”时,程序会给出错误:无法解析方法“InsertKey”。另外,我不知道在'InsertKey'函数中作为参数传递什么。我实现了一个由随机元素组成的数组。数组应该是其中一个参数,但我不知道另一个参数是什么 这是我的头文件: #ifndef REDBLACKTREE_H_ #define REDBLACKTREE_H_ t
#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好的,我从答案中删除了这一部分。谢谢。由于我不知道要在红黑树中添加元素需要传递什么,有什么建议吗?这既不是烦人的解析,也不是最烦人的解析解析。这只是一个简单的函数声明。@好的,我从答案中删除了这一部分。谢谢。有什么建议吗