我正在嘗試創建一個能夠保存多種型別資料的簡單二叉樹。二叉樹將使用資料進行硬編碼(編譯時可以為此作業)。這是我的代碼:
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<const char*>* 分配給型別 Node<int>*”。
現在,我完全理解錯誤訊息在說什么,并且我知道沒有辦法將 a 轉換char*為a int,但是有沒有辦法讓我的left_和right_指標成員指向模板型別?
對于這個專案,我不能包含任何第三方庫。
我嘗試將它們更改為,Node<T>*但它仍然不起作用,因為在root_創建初始節點時,它是使用int型別創建的。我還嘗試制作自定義 = 運算子:
Node<T>& operator=(const Node<const char*>* ptr) {
left_ = nullptr;
right_ = nullptr;
data_ = *ptr->data_;
return this;
}
這也不起作用,此時我有點超出了我的范圍。
uj5u.com熱心網友回復:
您可以通過使用繼承來解決能夠構建指標樹的直接問題。
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;
現在您可以構建樹并穿過它。但是你不能對每個節點中的值做任何事情,除非你對每個節點的型別有外部知識。
uj5u.com熱心網友回復:
我正在嘗試創建一個能夠保存多種型別資料的簡單二叉樹。
單個二叉搜索樹通常保存一種型別的資料。不同的不相關的樹可能保存不同型別的資料,但每棵樹應該只保存一種型別。
在 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課程。
在稍后階段,您可能還希望使用其他模板引數對樹進行引數化,例如比較器和分配器。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/532071.html
標籤:C 指针模板仿制药容器
上一篇:如何將類模板引數限制為某個子類?
