我试图创建一个简单的二叉树能够持有多种类型的数据。二叉树将使用数据进行硬编码(编译时间可以用于此)。下面是我的代码:
class BTree {
template <typename T>
struct Node {
Node* left_ = nullptr;
Node* right_ = nullptr;
T data_;
explicit Node(T value) : data_(value) {}
};
Node<int>* root_ = nullptr;
public:
BTree() {
root_ = new Node<int>(2);
auto ptr = root_;
ptr->left_ = new Node<const char*>("SomeString");
}
};
我从Node
现在,我完全理解错误信息是说什么,我知道没有办法将char*
转换为int
,但是有办法让我的left_
和right_
指针成员指向模板类型吗?
对于这个项目,我不能包含任何第三方库。
我尝试将它们更改为Node<T>*
,但它仍然不起作用,因为当创建初始root_
节点时,它是用int
类型创建的。我还尝试了自定义=操作符:
Node<T>& operator=(const Node<const char*>* ptr) {
left_ = nullptr;
right_ = nullptr;
data_ = *ptr->data_;
return this;
}
这也不起作用,在这一点上,我有点超出了我的范围。
您可以通过使用继承来解决无法构建指针树的直接问题。
struct NodeBase
{
NodeBase* left = nullptr;
NodeBase* right = nullptr;
};
template <typename T>
struct Node : NodeBase
{
T data;
explicit Node(T value) : data(value) {}
};
NodeBase* root = nullptr;
现在您可以构建树并遍历它。但是你不能对每个节点中的值做任何事情,除非你有每个节点类型的外部知识。
我正在尝试创建一个能够保存多种类型数据的简单二叉树。
单个二叉搜索树通常保存一种类型的数据。不同不相关的树可以保存不同类型的数据,但每个树只能保存一种类型。
在c++中,这通常是通过模板化树的类型来实现的(而不仅仅是节点的类型)。
template <typename T>
class BinarySearchTree {
struct Node { // not a template on its own
T data;
Node* left;
Node* right;
};
Node* root;
// the rest of the tree class
};
你应该考虑到BinarySearchTree<const char*>
不会做你想要的。使用BinarySearchTree<std::string>
或滚动您自己的简化string
类。
在稍后的阶段,您可能还希望使用其他模板参数对树进行参数化,例如比较器和分配器。