Nested Class in template
-
Hallo, ich versuche mich gerade an Templates wieder mit einem BST, jedoch lässt sich das folgende Beispiel nicht kompilieren.
#ifndef BINARYTREE_H #define BINARYTREE_H template<class T> class Node; template<class T> class BinaryTree { public: BinaryTree() : root(nullptr) {}; virtual ~BinaryTree() {}; void insert(const T data) { Node<T> *newNode = new Node<T>(data); insert(root, newNode); } private: void insert(Node<T> *&destination, Node<T> *&source) { if(destination) { source->parent = &*destination; if(source->data <= destination->data) insert(destination->left, source); else insert(destination->right, source); } else { destination = source; } } class Node { public: Node(const T data) : data(data), parent(nullptr), left(nullptr), right(nullptr) {}; T data; Node *parent, *left, *right; } Node<T> *root; }; template<class T> }; #endif /* BINARYTREE_H */
BinaryTree.h:73:5: error: ‘BinaryTree<T>::Node’ is not a template Node<T> *root; BinaryTree.h:24:29: error: no matching function for call to ‘BinaryTree<int>::insert(BinaryTree<int>::Node*&, BinaryTree<int>::Node*&)’ insert(root, newNode); ...
Könnte mir bitte jemand sagen, wie ich eine nested class in templates implementieren kann.
-
Da ist irgendetwas falsch gecopypasted, am Ende ist Murks.
Und deine forward-declaration deklariert nicht BinaryTree<T>::Node, sondern Node<T>. Sie ist im Übrigen auch überflüssig, denn der Compiler findet BinaryTree<T>::Node und nicht Node<T> und sagt, dass die nested class kein Template ist.
Schreib einfach nur Node und lösch die Forward-Deklaration und es sollte gehen.
-
Tur mir leid für den murks
#ifndef BINARYTREE_H #define BINARYTREE_H template<class T> class BinaryTree { public: BinaryTree() : root(nullptr) {}; virtual ~BinaryTree() {}; void insert(T data) { Node *newNode = new Node(data); insert(root, newNode); } private: void insert(Node *&destination, Node *&source) { if(destination) { source->parent = &*destination; if(source->data <= destination->data) insert(destination->left, source); else insert(destination->right, source); } else { destination = source; } } class Node { public: Node(T data) : data(data), parent(nullptr), left(nullptr), right(nullptr) {}; T data; Node *parent, *left, *right; }; Node *root; }; #endif /* BINARYTREE_H */
Aber mit den Änderungen, geht es leider auch nicht.
BinaryTree.h:31:17: error: ‘Node’ has not been declared void insert(Node *&destination, Node *&source) BinaryTree.h:34:21: error: request for member ‘parent’ in ‘source->’, which is of non-class type ‘int’ source->parent = &*destination; ...
-
Jetzt einfach noch Node vor dem privaten insert deklarieren (oder gleich die ganze Definition verschieben).