我正在尝试使用模板来获取 std:list of items,其中每个项目都有一个指向包含它的列表的指针,但我一直在点击编译器消息。
这是代码的一个非常精简的版本。
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);
}
但是,我的编译器在该行中遇到了问题:-
tmp.owner = this;
错误是:
[BCC32 Error] Unit7.cpp(30): E2034 Cannot convert 'BaseList<MyItem> * const' to 'MyList *'
就像“this”不知何故变成了const,但我不明白为什么。编译器是 Codegear C++Builder 2009。
我承认我不是 100% 满意使用模板,所以我不确定这是我的问题还是编译器的问题。没有使用模板的相同代码编译得很好,但显然这不是我想要的,因为我有几个项目/列表类想要以这种方式工作。
此外,是否有更好的技术可以避免在每个项目中包含所有“所有者”指针?
编辑:我认为我将示例剥离得太远了:“MyList”实际上引入了新方法,然后“MyItem”必须通过“所有者”指针访问。
摘要:感谢所有评论和回答。正如公认的答案所说,问题只是指向 BaseList 与 MyList 的指针之间的类型不兼容之一。
关于从 STL 容器和替代设计派生的问题也很有帮助,但我使用的解决方案与下面 Luc Touraille 的解决方案基本相同。