2009-06-05 9 views
2

例、私は、STLコンテナであるメンバ変数を持つようにクラスを特化したいベクトルやリストを言うので、私のようなものが必要です。だから私が行うことができますC++テンプレートを使用して、コレクションタイプとそのタイプの特殊化を指定できますか?

template <class CollectionType, class ItemType> 
class Test 
{ 
public: 
    CollectionType<ItemType> m_collection; 
}; 

を:

Test t = Test<vector, int>(); 
t.m_collection<vector<int>> = vector<int>(); 

しかし、これはあなたが望む

test.cpp:12: error: `CollectionType' is not a template 

答えて

9

なぜこのようにしないのですか?

template <class CollectionType> 
class Test 
{ 
public: 
    CollectionType m_collection; 
}; 

Test t = Test<vector<int> >(); 
t.m_collection = vector<int>(); 

あなたがCollectionType::value_typeを使用することができた項目タイプが必要な場合。

EDIT:VALUE_TYPEを返すメンバ関数の作成に関するあなたの質問に応じて、あなたはこのようにそれを実行します。

typename CollectionType::value_type foo(); 

CollectionTypeは、まだ実際の型にバインドされていないので、あなたは、型名を追加します。だから、それが見えるかもしれないvalue_typeはありません。

+0

妥当な答え:この方法は、テンプレート化されていないコンテナでも機能するため、テストはより一般的です。 –

+0

Item型のオブジェクトを返すメンバ関数を記述する必要があるので、私はそれを行うことはできません。 できません。 たとえば、コレクションタイプ::値タイプ* advance() などです。 – justinhj

+0

@justinhj:どうしてですか?なぜあなたはCollectionType :: value_typeを使用できませんか? – jalf

13

何生成は、テンプレートテンプレートパラメータである:

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コンテナを扱うのは本当にねじれたようでかなり複雑なもの、で終わる...

私のアドバイス:よりよいアプローチのためのグレッグロジャースの答えを見てください:)!

+0

動作することを、私はかなりそれを理解していません。 の一部ですか? – justinhj

+2

これは私のためにコンパイルされませんでした(VS 2008)、私は、テンプレートの宣言を "テンプレートクラスCollectionType、クラスItemType>"にするベクトルのアロケータの2番目の型を追加したいと思います。 m_collectionの宣言は、 "CollectionType "となりました。 "テンプレートテンプレートパラメータ"を指摘するために+1、ありがとう:) –

+0

テンプレートテンプレートパラメータに関する優れたチュートリアルについては、http://www.informit .com/articles/article.aspx?p = 376878 " –

2

オンラインコモはこれを好き:

#include <vector> 

template <template <class T, class A = std::allocator<T> > class CollectionType, class ItemType> 
class Test 
{ 
public: 
    CollectionType<ItemType> m_collection; 
}; 

void foo() 
{ 
using std::vector; 
Test<vector,int> t = Test<vector, int>(); 
t.m_collection = vector<int>(); 
} 
関連する問題