何生成は、テンプレートテンプレートパラメータである:
template <template <typename> class CollectionType, class ItemType>
class Test
{
public:
CollectionType<ItemType> m_collection;
};
最初のテンプレートパラメータ(CollectionType
)がタイプテンプレートであることを指定しました。したがって、Test
は、それ自体がテンプレートである型でのみインスタンス化することができます。 テンプレートパラメータ:1つは要素型用、もう1つは管理用に使用されるアロケータの型用であるため、STLコンテナでは@BinaryWorrierがコメントで指摘したようにSTLコンテナでは機能しません。ストレージ割り当て(デフォルト値)。
template <template <typename,typename> class CollectionType, class ItemType>
class Test
{
public:
CollectionType<ItemType> m_collection;
};
しかし、待って、いずれかの動作しません:それは2つのパラメータを持つように
したがって、あなたは、最初のテンプレートパラメータを変更する必要があります!実際、CollectionType
は別のパラメータ、アロケータを待っています...だから今は2つのソリューションがあります:
1。特定のアロケータの使用を強制する:
CollectionType<ItemType, std::allocator<ItemType> > m_collection
2。あなたのクラスにアロケータのためのテンプレートパラメータを追加します。
template <template <typename,typename> class CollectionType,
class ItemType,
class Allocator = std::allocator<ItemType> >
class Test
{
public:
CollectionType<ItemType, Allocator> m_collection;
};
ご覧のように、あなたはSTLコンテナを扱うのは本当にねじれたようでかなり複雑なもの、で終わる...
私のアドバイス:よりよいアプローチのためのグレッグロジャースの答えを見てください:)!
妥当な答え:この方法は、テンプレート化されていないコンテナでも機能するため、テストはより一般的です。 –
Item型のオブジェクトを返すメンバ関数を記述する必要があるので、私はそれを行うことはできません。 できません。 たとえば、コレクションタイプ::値タイプ* advance() などです。 – justinhj
@justinhj:どうしてですか?なぜあなたはCollectionType :: value_typeを使用できませんか? – jalf