Я пытаюсь создать список объектов, где каждый объект также хранит «владение» - т. Е. Он знает, какой список содержит его.
В ситуации, не связанной с шаблоном, это просто:
class FooList; // forward declaration
class FooItem
{
public:
FooList *owner;
...
};
class FooList: private std::list<FooItem>
{
...
};
Однако класс списка - это шаблон, основанный на содержании типа объекта, и я изо всех сил пытаюсь решить, как это указать.Я считаю, что класс FooItem теперь должен быть шаблоном, потому что тип 'owner' может варьироваться:
template <class E> class FooItem
{
public:
std::list<E> *owner;
};
template <class E> class FooList: private std::list<E>
{
...
};
Но, учитывая мои два шаблона, как я могу определить новые типы, которые я хочу?Ниже приведен фрагмент, который, как мне кажется, мне нужен, но он дает "error: Multiple declaration for BarItem"
.
class BarItem;
typedef FooList<BarItem> BarList;
typedef FooItem<BarList> BarItem;
РЕДАКТИРОВАТЬ:
Спасибо тем, кто указал навыпуск std::list<E>
вместо std::list<FooItem<E> >
РЕДАКТИРОВАТЬ 2: Переименованные классы в Base, Derived, BaseList, DerivedList.
Моя настоящая проблема заключалась в «циклическом определении типа».Я думаю, что после еще нескольких поворотов я сделаю то, что мне нужно.Он создает «настоящий» класс BarItem, а не просто typedef, но, кажется, по крайней мере сейчас компилируется.
template <class E> class BaseList; // forward declaration
template <class E> class Base
{
public:
BaseList< Base<E> > *owner;
};
template <class E> class BaseList: private std::list< E >
{
};
// typedef Base<BaseList<Derived> > Derived; //This won't compile, unsurprisingly.
class Derived : public Base < BaseList<Derived> > // Surprisingly, this seems to.
{
...
};
typedef BaseList<Derived> DerivedList;
Кажется ли это имеет смысл?Это обычная идиома или что-то ужасное?