Я пытаюсь написать пользовательский контейнер в стиле STL. Для простоты предположим, что это список. Я посмотрел стандартный способ определения такого контейнера:Вложенный класс как параметр шаблона
template <typename T, typename A = std::allocator<T> > class mylist;
Теперь я хочу, чтобы управлять узлами списка, используя вложенный класс:
(inside mylist)
class node {
T data;
node *next;
}
Это мое понимание того, что я не нужен поместите спецификатор template
перед определением node
, поскольку компилятор будет создавать отдельные классы mylist<T,A>::node
для каждой комбинации параметров шаблона mylist
.
Однако теперь мне нужно выделить память не только для данных типа T
, но и для их обертки node
. Таким образом, я хотел бы, чтобы параметр шаблона по умолчанию имел тип std::allocator<mylist<T>::node>
. В этот момент, однако, mylist
еще не была объявлена, и компилятор, по понятным причинам расстроило:
error: `mylist' was not declared in this scope
Как бы один решить эту головоломку? Существует два ограничения:
- Обычно я объявляю пропавший класс без полного объявления его содержимого. Однако, поскольку он вложен внутри самой вещи, которую я хочу объявить, это не вариант.
- Мне нужно
node
быть вложенным, так как ему нужно получить доступ к экземпляру распределителяmylist
. Например, у меня естьoperator=
, объявленный наnode
, где много управления памятью происходит рекурсивно. Это может быть излишним для списка, и вы можете сделать это в пределахmylist
, тем самым снижая параметрическую зависимостьnode
отA
, но это имеет решающее значение для структуры данных, которую я реализую.
Возможно, стоит посмотреть, как g ++ реализует 'std :: list'. –
Посмотрите на распределитель 'rebind' – Yakk