2016-04-24 12 views
1

Ich bekomme einen Fehler, wenn ich den Destruktor "~ Binary_tree()" einschließe. Aber wenn ich es entferne, wird alles kompiliert.Collect2-Fehler bei Destruktordefinition innerhalb einer Klasse

Meine node.h Datei

template<class T> 
class Binary_tree 
{ 
    private: 
     void insert(T val, Node<T> *ptr); 
     Node<T> *search(T val, Node<T> *ptr); 
     Node<T> *root; 

    public: 
     Binary_tree() 
     { 
      root = NULL; 
     } 
     ~Binary_tree(); 
     void insert(T val); 
     Node<T> *search(T val); 
}; 

mein main.cc

#include<iostream> 
#include "node.h" 

using namespace std; 

int main() 
{ 
    Binary_tree<char> tree; 
    return 0; 
} 

Antwort

1

Sie haben Ihre destructor definiert, erklärte sie nur. Es sollte sein:

~Binary_tree() { /*delete tree*/ } 

Was Sie sehen, ist eigentlich ein Linker-Fehler, und kompilieren Fehler nicht. Sie könnten denken, dass Sie auch einige andere Methoden wie insert oder search nicht definiert haben und Sie erhalten keinen Fehler, ... aber sie werden nicht in Ihrem Code aufgerufen - so Linker gibt keinen Fehler aus. Andererseits wird der Destruktor in Ihrem Beispiel implizit aufgerufen, wenn das Objekt tree den Geltungsbereich verlässt. Wenn Sie nicht selbst einen hinzufügen, erstellt der Compiler selbst eine Definition - deshalb erhalten Sie keinen Fehler, wenn Sie die Deklaration ~Binary_tree(); entfernen. Dieser kompilierte synthetisierte Destruktor wird Ihren Baum nicht freigeben, Sie müssen es selbst machen - oder benutzen Sie geteilte PTRs.

0

Vorlage ist Ersatz des Makros, daher muss die Schablonendefinition am Instanziierungspunkt verfügbar sein. Sie sollten die Definition von ~ Binary_tree und alle anderen Methoden in die Vorlagendefinition einfügen.

Verwandte Themen