テンプレートを使用してアイテムのstd:listを取得しようとしています。各アイテムには、それを含むリストへのポインターがありますが、コンパイラメッセージが表示され続けます。
これは非常に簡略化されたバージョンのコードです。
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 *'
「これ」がどういうわけかconstになったようですが、理由がわかりません。コンパイラはCodegearC++Builder2009です。
テンプレートを使用することに100%満足しているわけではないことを認めているので、これが私の問題なのかコンパイラなのかわかりません。テンプレートを使用しない同じコードは正常にコンパイルされますが、このように機能させたいアイテム/リストクラスがいくつかあるため、明らかにそれは私が望むものではありません。
また、各アイテムにすべての「所有者」ポインタが含まれないようにするためのより良い手法はありますか?
編集:私は例をあまりにも削除したと思います:「MyList」は実際に新しいメソッドを導入し、「MyItem」は「owner」ポインターを介してアクセスする必要があります。
概要:すべてのコメントと回答に感謝します。受け入れられた答えが言うように、問題は単にBaseListへのポインターとMyListの間の型の非互換性の1つです。
STLコンテナと代替設計から派生することに関して提起された問題も役立ちますが、私が使用したソリューションは、以下のLucTourailleのものと本質的に同じです。