2016-09-14 209 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 *>這樣的東西可以說明(N * root)'。我很困惑。再次感謝! – friendoflore

相關問題