由于Tree类中的模板而出现错误

我有一个 Tree 类,在这个类中,我有一个 Node 类(嵌套),它是私有的。 Tree 类当然是模板类。
问题是,当我要将树孩子插入没有确切孩子数目的树父中时,出现错误,指出转换类型不兼容。


这是我的代码:
tree.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,N>::Tree(T data,char size) {
  Node* node = new Node(data);
  _info = node;
}

template <typename T,N>::Tree(Tree&& t) {
  _info = t._info;
  t._info = nullptr;
}

template <typename 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,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

main.cpp

#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,Tree& childTree){
      | 

我也愿意就改进此代码的方法提出建议。
谢谢...

ppheadsman 回答:由于Tree类中的模板而出现错误

  

Tree类当然是模板类。

树不一定是模板。不要“仅仅因为”做事;)。

Tree<char,10>Tree<char,5>是两种不同的类型。除非您采用某种方法将它们转换,否则您不能将它们转换为另一种。

尚不清楚,为什么您决定让树中的子节点数成为树类型的一部分。添加或删除子代会产生不同类型的树。

考虑std::arraystd::vectorstd::array的元素数量作为模板参数,因为其大小无法更改。另一方面,std::vector具有动态大小。

实际上,我不明白为什么您的Tree需要知道其节点children数组的大小。我错过了它,或者您从未在N中使用Tree。我并没有遵循所有的细节,但是看来您可以安全地从代码中完全删除N,并且将std::vector用于子节点。

,

为什么不使用std :: vector并仅将N作为参数传递给节点?然后在节点中创建一个插入函数,以检查未达到最大大小

,

当c ++创建对象时,它是静态创建的,这意味着SIZE 4的对象与SIZE 5的对象是一个完全不同的对象。这两个对象完全不同,您无法像对待您一样对待它们>

本文链接:https://www.f2er.com/3149204.html

大家都在问