2016-04-24 13 views
1

"〜Binary_tree()"デストラクタをインクルードするとエラーが発生します。しかし、私がそれを取り除くと、すべてがコンパイルされます。クラス内のデストラクタ定義のCollect2エラー

マイnode.hファイル

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); 
}; 

私main.cc

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

using namespace std; 

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

答えて

1

あなただけそれを宣言し、あなたのデストラクタを定義していません。

実際にはリンカーエラーが表示され、エラーはコンパイルされません。 insertsearchのような他のメソッドもあまり定義されていないと思うかもしれませんが、エラーは発生しませんが、あなたのコードでは呼び出されないので、リンカはエラーを出力しません。一方、treeオブジェクトが範囲外になると、あなたの例のデストラクタは暗黙のうちに呼び出されます。あなた自身を追加しないと、コンパイラはそれ自身で定義を作成します - それで、~Binary_tree();の宣言を削除するとエラーは発生しません。このコンパイラ合成デストラクターはあなたのツリーを解放しません。あなた自身でそれをやる必要があります - 共有ptrsを使用する必要があります。

0

テンプレートはマクロの置き換えであり、テンプレート定義はインスタンス化ポイントで使用できる必要があります。 〜Binary_treeの定義と他のすべてのメソッドをテンプレート定義に入れるべきです。

関連する問題