Вложенный шаблон выпуск C ++

0

У меня есть шаблонный класс узлов, объявленный как

    template <class T_>
    class Node : public std::iterator<std::bidirectional_iterator_tag, T_, T_>
    {
    ...
    }

Это работает отлично, и я пытаюсь взять этот существующий класс и применить его к новому классу связанных списков.

Я хотел бы создать его, называя что-то вроде

    LinkedList<float> nodeList;

где он неявно принимает указанный тип, а внутри структуры класса обрабатывает его как Node типа T_.

Есть ли способ сделать это, не сделав узел подклассом LinkedList?

  • 0
    Помимо основного вопроса, вы считаете хорошей идеей унаследовать Node от std::iterator ? Я не вижу здесь отношения "есть". Вероятно, вы должны переосмыслить дизайн вашего класса.
Теги:

3 ответа

1

Это то, что вы просите?

template <class T_>
class LinkedList
{
public:
    typedef Node<T_> node_type;

    void AddNode(node_type *node)
    { /*...*/ }
};

Технически, typedef не требуется, но IME это хорошая оценка, чтобы typedef зависимых типов таким образом.

  • 0
    В конечном итоге основная программа не будет знать об узлах напрямую, только об их поведении. Итак, я попробовал что-то вроде void AddNode (T_ value) {/*...*/}, и это дает мне странную ошибку: невозможно преобразовать из 'Node <T_> *' в 'Node <T_> *' , Никогда не видел, чтобы с таким же типом, LOL ... это означает, что есть проблема с моим копировать Ctor?
  • 0
    @Kiery, поскольку у вас есть 3 ответа и все они о разных вещах, я думаю, что вам нужно отредактировать свой вопрос, объяснив, чего вы хотите добиться, более точно, и добавить соответствующий код, чтобы получить значимые ответы.
Показать ещё 2 комментария
0

Вы можете указать итератор в качестве аргумента шаблона по умолчанию:

template<
    class T,
    class Iterator = Node<T>
> class LinkedList
{
    // ...
};
0

Если я правильно понял ваш вопрос, вам нужно создать экземпляр шаблона класса, используя шаблонный тип класса. Используйте этот синтаксис:

LinkedList<Node<float> > nodeList;

(обратите внимание на пробел между > >, это всегда хорошая идея добавить его, потому что старые версии некоторых компиляторов имеют проблемы с отличием таких конструкций от операторов сдвига >>)

  • 0
    Спасибо за быстрый ответ, к сожалению основной не будет напрямую знать об узлах и, следовательно, может быть напечатан только как LinkedList <float>

Ещё вопросы

Сообщество Overcoder
Наверх
Меню