Я пытаюсь использовать шаблоны для получения std: списка элементов, где у каждого элемента есть указатель на список, который его содержит, но я продолжаю нажимать на сообщение компилятора.
Вот очень урезанная версия кода.
template <class E> class Item
{
public:
E* owner; // pointer to list that owns us.
};
template <class E> class BaseList: public std::list<E>
{
protected:
typedef std::list<E> inherited;
public:
void push_back(const E &e)
{
E tmp(e);
tmp.owner = this; // This line gives the error.
inherited::push_back(tmp);
}
};
class MyList;
class MyItem : public Item<MyList>
{
};
class MyList : public BaseList<MyItem>
{
};
void foo() // test code to instantiate template
{
MyList l;
MyItem m;
l.push_back(m);
}
Тем не менее, мой компилятор barfs в строке: -
tmp.owner = this;
Ошибка:
[BCC32 Error] Unit7.cpp(30): E2034 Cannot convert 'BaseList<MyItem> * const' to 'MyList *'
Как будто "это" каким-то образом стало постоянным, но я не понимаю, почему. Компилятор - Codegear C ++ Builder 2009.
Я признаю, что не на 100% доволен использованием шаблонов, поэтому я не уверен, является ли это моей проблемой или компиляторами. Тот же код без использования шаблона прекрасно компилируется, но, очевидно, это не то, что я хочу, так как у меня есть несколько классов item / list, которые хотят работать таким образом.
Кроме того, есть ли лучшая техника, позволяющая избежать указания всех указателей "владельца" на каждый элемент?
РЕДАКТИРОВАТЬ: Я думаю, я сократил пример слишком далеко: «MyList» фактически вводит новые методы, к которым «MyItem» должен затем обращаться через указатель «владельца».
РЕЗЮМЕ: Спасибо за все комментарии и ответы. Как говорится в принятом ответе, проблема заключается просто в несовместимости типов между указателем на BaseList и MyList.
Вопросы, связанные с производством контейнеров STL и альтернативных конструкций, также полезны, но решение, которое я использовал, по сути идентично приведенному ниже Люку Турэ.