[英]Getting error because of template in Tree class
我有一個樹class 並且在這個 class 我有一個節點class (嵌套),它是私有的。 樹class 當然是模板 class。
問題是,當我想將一個樹的孩子插入到一個沒有確切數量的孩子的樹父中時,我會收到一個類型不兼容的錯誤以進行轉換。
這是我的代碼:
樹.hpp
#ifndef TREE_HPP
#define TREE_HPP
#include <iostream>
#include <cstddef>
template <typename T, char N>
class Tree {
private:
class Node;
Node* _info;
public:
Tree();
Tree(T, char);
Tree(const Tree&) = delete; // copy constructor
Tree& operator= (const Tree&) = delete; // assignement by copy constructor
Tree (Tree&&); // transfer constructor
Tree& operator= (Tree&&); // assignement by transfer constructor
~Tree() {delete _info;}
bool ins(char, Tree&);
Tree* fils(char);
};
template <typename T, char N>
Tree<T, N>::Tree()
: _info(nullptr) {}
template <typename T, char N>
Tree<T, N>::Tree(T data, char size) {
Node* node = new Node(data);
_info = node;
}
template <typename T, char N>
Tree<T, N>::Tree(Tree&& t) {
_info = t._info;
t._info = nullptr;
}
template <typename T, char N>
Tree<T, N>& Tree<T, N>::operator= (Tree&& t) {
if (&t != this) {delete _info; _info = t._info; t._info = nullptr;}
return *this;
}
template <typename T, char N>
bool Tree<T, N>::ins(char index, Tree& childTree){
if (_info){
_info->getChildren()[index] = &childTree;
return true;
}
return false;
}
template <typename T, char N>
Tree<T,N>* Tree<T, N>::fils(char index){
return _info->getChildren()[index];
}
template <typename T, char N>
class Tree<T, N>::Node {
private:
T _data;
Tree* _children[N];
bool _isWord;
public:
Node();
Node(T);
Tree** getChildren() {return this->_children;}
T getData(){return this->_data;}
~Node() = default;
};
template <typename T, char N> // Node class default constructor
Tree<T,N>::Node::Node(){
_data = 0;
_children = nullptr;
_isWord = false;
}
template <typename T, char N> // Node class constructor
Tree<T,N>::Node::Node(T data){
_data = data;
_isWord = false;
for (char i = 0; i < N; i++)
_children[i] = NULL;
}
#endif
主文件
#include <iostream>
#include <cstddef>
#include "tree.hpp"
#define SIZE 5
#define display(x) std::cout<<x<<std::endl
int main() {
Tree<char,SIZE> n1('A',SIZE);
Tree<char,SIZE> n1_1('B',SIZE); // works fine
Tree<char,10> n1_2('C',10); // sends the error
n1.ins(0,n1_1);
n1.ins(1,n1_2);
return 0;
}
錯誤是:
main.cpp: In function ‘int main()’:
main.cpp:16:12: error: cannot convert ‘Tree<char, '\012'>’ to ‘Tree<char, '\005'>&’
16 | n1.ins(1,n1_2);
| ^~~~
| |
| Tree<char, '\012'>
In file included from main.cpp:4:
tree.hpp:80:40: note: initializing argument 2 of ‘bool Tree<T, N>::ins(char, Tree<T, N>&) [with T = char; char N = '\005']’
80 | bool Tree<T, N>::ins(char index, Tree& childTree){
|
我也願意就改進此代碼的方法提出建議。
謝謝...
樹 class 當然是模板 class。
樹不一定是模板。 不要做“僅僅因為”的事情;)。
Tree<char,10>
和Tree<char,5>
是兩種不同的類型。 除非您實施某種方法來轉換它們,否則您無法將它們轉換為另一種。
目前尚不清楚,為什么您決定將樹中的子節點數作為樹類型的一部分。 添加或刪除子節點會為您生成不同類型的樹。
考慮std::array
與std::vector
。 std::array
有元素數量作為模板參數,因為它的大小永遠不會改變。 另一方面, std::vector
具有動態大小。
實際上我不明白為什么你的Tree
需要知道它的節點children
數組的大小。 要么我錯過了它,要么你從不在Tree
中使用N
。 我沒有遵循所有細節,但您似乎可以安全地從代碼中完全刪除N
並為節點子節點使用std::vector
。
為什么不使用 std::vector 並且只將 N 作為參數傳遞給節點? 然后在檢查未達到最大大小的節點中創建插入 function
When c++ creates an object it creates it staticaly which means that an object with SIZE 4 is a whole diffrent object from the one with SIZE 5.these two objectare nothing alike and you can't trat them as if thy were
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.