2012-01-18 8 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':クラステンプレートの使用にはテンプレート引数リストが必要です

ご意見をいただければ幸いです。

おかげ

あなたはそれが.hファイルにしておく必要があり、.cppファイルにテンプレート関数の定義を持つことができませんマーク

+0

エラーは、戻り値の型はテンプレート化されていません。しかし、テンプレートコード(一般的に)はヘッダファイル内にある必要があります。だから、クラス定義の中に全体を入れて、問題はなくなります。 –

答えて

0

:)

をも、ピーター・アレクサンダーは正しいですその関数定義をソースで編集する必要がある場合、私は彼の答えに任せておきます:)

8

ソースファイルでは、BinaryTreeの代わりにBinaryTree<T1>を指定する必要があります。すなわち

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

テンプレートは、クラス/構造体内のパラメータリストなしでのみ参照できます。


.cppをINGの#includeせずに)それは一般的に、それはそれは、人々が暗黙のうちにそれらをインスタンス化することはできないことを意味しますので、.cppファイル内の非専門的なテンプレートを持っていることは悪い考えですも注意してください。

経験則として、.cppには特殊なテンプレートのみが必要です。特殊でないテンプレートは.hに存在する必要があります。

あなたが何をしているのかわかっていて、手動でテンプレートをインスタンス化する計画があれば、是非体型を.cppに入れてください。しかし、一般的には人間のものではありません。

+0

多くの方に感謝します。問題が解決しました! – Mark

0

戻り値の型が完全ではないため、テンプレート引数も必要です。

関連する問題