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;
    
    ...
    

  • Mod

    Jetzt einfach noch Node vor dem privaten insert deklarieren (oder gleich die ganze Definition verschieben).


Log in to reply