У меня есть шаблонный класс узлов, объявленный как
template <class T_>
class Node : public std::iterator<std::bidirectional_iterator_tag, T_, T_>
{
...
}
Это работает отлично, и я пытаюсь взять этот существующий класс и применить его к новому классу связанных списков.
Я хотел бы создать его, называя что-то вроде
LinkedList<float> nodeList;
где он неявно принимает указанный тип, а внутри структуры класса обрабатывает его как Node типа T_.
Есть ли способ сделать это, не сделав узел подклассом LinkedList?
Это то, что вы просите?
template <class T_>
class LinkedList
{
public:
typedef Node<T_> node_type;
void AddNode(node_type *node)
{ /*...*/ }
};
Технически, typedef
не требуется, но IME это хорошая оценка, чтобы typedef зависимых типов таким образом.
Вы можете указать итератор в качестве аргумента шаблона по умолчанию:
template<
class T,
class Iterator = Node<T>
> class LinkedList
{
// ...
};
Если я правильно понял ваш вопрос, вам нужно создать экземпляр шаблона класса, используя шаблонный тип класса. Используйте этот синтаксис:
LinkedList<Node<float> > nodeList;
(обратите внимание на пробел между > >
, это всегда хорошая идея добавить его, потому что старые версии некоторых компиляторов имеют проблемы с отличием таких конструкций от операторов сдвига >>
)
Node
отstd::iterator
? Я не вижу здесь отношения "есть". Вероятно, вы должны переосмыслить дизайн вашего класса.