2016-09-14 4 views
0

У меня есть двоичное дерево, и я пытаюсь поместить каждую глубину узлов в свой собственный связанный список.C++ классы шаблонов sibling в качестве параметров шаблона шаблона

У меня есть шаблоны классов:

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». Единственный параметр шаблона, который вам нужен, - для 'T' TreeNode. – caps

ответ

3

После должно быть достаточно:

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

Спасибо! Вопрос, который я (ошибочно) думал, что я спрашивал, также использовал шаблоны для шаблонов классов. Что-то вроде 'std :: vector *> listify (N * root)'. Я был смущен. Еще раз спасибо! – friendoflore

Смежные вопросы