2016-04-24 44 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

您還沒有定義你的析構函數,只宣佈它。它應該是:

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

你看到的實際上是一個鏈接器錯誤,而不是編譯錯誤。您可能會認爲您還沒有定義其他方法,如insertsearch,並且您沒有錯誤,但是它們未在您的代碼中調用 - 所以鏈接器不會輸出錯誤。另一方面,當tree對象超出範圍時,將隱式調用示例中的析構函數。如果你自己不添加一個,編譯器會自己創建定義 - 這就是爲什麼當你刪除~Binary_tree();的聲明時你沒有錯誤。這個編譯器合成的析構函數不會釋放你的樹,你必須自己做 - 或使用共享的ptrs。

0

模板是宏的替換,所以模板定義必須在實例化點可用。您應該將〜Binary_tree和所有其他方法的定義放到模板定義中。

相關問題