是否有一种方法将模板类型分配给已定义的类结构?



我试图创建一个简单的二叉树能够持有多种类型的数据。二叉树将使用数据进行硬编码(编译时间可以用于此)。下面是我的代码:

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*"得到错误信息&;Cannot assign to type 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类。

在稍后的阶段,您可能还希望使用其他模板参数对树进行参数化,例如比较器和分配器。

最新更新