2013-06-03 183 views
10

玉傢伙... 我有以下類模板類的構造函數

#include <functional> 

template <typename TValue, typename TPred = std::less<TValue>> 
class BinarySearchTree { 
    struct TNode { 
     TValue value; 
     TNode *pLeft; 
     TNode *pRight; 
    }; 
public: 
    BinarySearchTree(); 
    ~BinarySearchTree(); 

    . . . 
private: 
    TNode *pRoot; 

    . . . 
}; 
我.cpp文件

然後我像這樣定義的構造函數/析構函數:

template <typename TValue, typename TPred> 
BinarySearchTree<TValue, TPred>::BinarySearchTree() : pRoot(0) {} 

template <typename TValue, typename TPred> 
BinarySearchTree<TValue, TPred>::~BinarySearchTree() { 
    Flush(pRoot); 
} 

我的主要功能:

int main() {  
    BinarySearchTree<int> obj1; 
    return 0; 
} 

和我得到以下鏈接錯誤:

public: __thiscall BinarySearchTree<int,struct std::less<int>>::BinarySearchTree<int,struct std::less<int> >(void) 

我試圖把構造函數的定義放到頭文件中,我沒有錯誤。只有當我嘗試在cpp文件中定義它。

+6

您的問題的答案是[這裏](http://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-file) - 抱歉,錯誤的鏈接在近距離投票 –

回答

17

不要在cpp文件中定義模板,而是將函數的實現放在頭文件中,並保留主函數原樣。模板默認爲內聯。因此它們對連接器不可見。而包含main()的文件看不到模板的定義。因此錯誤。

+3

我希望在所有的C++教程網站上都能看到它。 –

0

最後留下空間並嘗試。 它可能被視爲左移操作符!

template <typename TValue, typename TPred = std::less<TValue> > 
+10

自C++ 11以後,可以在'>>'之間不添加空格。 – taocp