2016-09-14 7 views
0

私はバイナリツリーを持っており、それぞれの深さを独自のリンクリストに入れようとしています。テンプレートテンプレートパラメータとしてC++の兄弟テンプレートクラス

は、私はクラステンプレートを持っている:

template <typename T> 
class Node 
{ 
    public: 
     T data; 
}; 

template <typename T> 
class ListNode : public Node<T> 
{ 
    public: 
     ListNode * next; 
}; 

template <typename T> 
class TreeNode : public Node<T> 
{ 
    public: 
     TreeNode * left; 
     TreeNode * right; 
}; 

は、タスクを達成するために、私は、パラメータとしてTreeNode<T> * rootを持ち、vector<ListNode<T> *>を返す関数テンプレートを使用して計画しました。

機能テンプレートを定義する正しい方法は何ですか?

はそれにアプローチする方法を知らない、私が最初にこれを達成するための方法であると、このような何かを期待:

template <template <typename> class Node, typename T> 
std::vector<ListNode<T> *> listify(TreeNode<T> * root) 
{ 
    // Do stuff... 
} 

しかし、これは動作しません。

コンパイラが大丈夫であるように思え:

template <template <typename> class TreeNode, typename T> 
std::vector<ListNode<T> *> listify(TreeNode<T> * root) 
{ 
    // Do stuff... 
} 

はなぜ/まさにここでは、この作業を何が起こっているのでしょうか?これは、兄弟クラスのテンプレートでこれを行う正しい方法ですか?続き

+0

'TreeNode'があるテンプレートパラメータである必要はありません。 @ jarod42が暗示するように、 'TreeNode'クラスを参照することができます。必要なテンプレートパラメータはTreeNodeの 'T'だけです。 – caps

答えて

3

は十分なはずです:

template <typename T> 
std::vector<ListNode<T>*> listify(TreeNode<T>* root) 
+0

ありがとう!私が(間違って)質問した質問は、クラステンプレートのテンプレートも使用していたことです。 'std :: vector *> listify(N * root)'のようなものです。私は混乱していた。再度、感謝します! – friendoflore