2012-01-18 47 views
2

此刻,我正在駕車彎道。作爲一個自制的練習,我想在一個類中模擬一個遞歸調用。在.h文件我有:模板遞歸函數的語法是什麼?

template <typename T1> 

    class BinaryTree 
    { 
    public: 
     BinaryTree(T1 element); 
     ~BinaryTree(); 

    BinaryTree* addLeftLeaf(BinaryTree<T1>* node); 

等等

然後在.cpp

template <typename T1> BinaryTree* BinaryTree<T1>::addLeftLeaf(BinaryTree<T1>* node) 
{ 
    return node; 
} 

我試過的想法看似負載,但迄今一無所獲。只是錯誤,如錯誤C2955:'BinaryTree':使用類模板需要模板參數列表

任何建議,將不勝感激。

感謝

馬克

+0

錯誤是返回類型不是模板。但是模板代碼(通常)需要在頭文件中。所以把整個事情放在類定義裏面,問題就會消失。 – 2012-01-19 00:06:17

回答

0

你不能在.cpp文件中的模板函數的定義,它必須是在.h文件:)

也,彼得·亞歷山大是正確的關於需要對源代碼中的那個函數定義進行編輯,我會將其留給他的答案:)

8

在源文件中,您需要指定BinaryTree<T1>而不僅僅是BinaryTree。即

template <typename T1> 
BinaryTree<T1>* BinaryTree<T1>::addLeftLeaf(BinaryTree<T1>* node) 
{ 
    return node; 
} 

你只能在類/結構體內引用一個沒有參數列表的模板。


也當心通常這是一個壞主意,有在.cpp文件非專業的模板,因爲這意味着人們將無法隱式實例化它們(不#include荷蘭國際集團的.cpp)。

作爲一個經驗法則,只有專門的模板應該在.cpp。非專門的模板應該存在於.h中。

如果你知道自己在做什麼,並計劃手動實例化模板,那麼通過一切手段將身體放在.cpp,但通常這不是人們做的事情。

+0

非常感謝彼得。問題解決了! – Mark 2012-01-19 06:34:49

0

返回類型不完整,它也需要模板參數。