2011-01-31 9 views
0

私はリストのようなテンプレートクラスsll(シングルリンクリスト)を作成しました。今、私はそれにアロケータをプラグインしようとしています。私は、デフォルトのアロケータ、アロケータ、プールベースのアロケータ、pool_allocatorを持っています。これらはSTLアロケータインターフェイスの後に設計されていますが、アロケータが処理する要素の数(max_size)をテンプレートパラメータとして追加する必要があります。だから、私は次のことをしました。デフォルトのテンプレートテンプレートパラメータの構文

enum {Default_1 = 16};   // for example 
template <typename T, size_t N = Default_1> 
struct allocator { 
}; 

enum {Default_2 = 32};   // for example 
template <typename T, size_t N = Default_2> 
struct pool_allocator { 
}; 

私は、使用場合、クライアントによって2種類をサポートしたい:

1. sll<int> == implying ==> sll<int, allocator<int, Default_1> > 

2. sll<int, pool_allocator<int, 4096> > 

私が午前難易度はSLLのテンプレートクラスにデフォルトのアロケータを指定しています。当初は私は持っていた

template<typename T, typename Allocator = allocator<T> > class sll { ...}; 

それは動作しますが、問題は、ユーザーができます;アロケータの容量を指定します。

私は

template<typename T, 
    typename Allocator = allocator< typename T, size_t N = Default_3> > 
class sll { ... }; 

を試してみましたが、私はエラーが表示されます。

error: template argument 1 is invalid 

私はいくつかの他の組み合わせを試してみましたが、それらのどれも働きました。この時点で、私はアイデアがなくなり、SOコミュニティからの助けを求めています。任意の提案やポインタが評価されます。

答えて

3

あなたは書くことがあります。

template<typename T, 
    typename Allocator = allocator<T, Default_3> > 
class sll { ... }; 
+0

1:ありがとうございます。それはシンプルですが、私は最も単純なオプションを見落としました:-(後ろの質問は次のとおりです:sllクラステンプレートの中で、アロケータの2番目のテンプレート引数にアクセスするにはどうすればいいですか?(大文字のAをメモしてください) – Arun

+0

例えば ​​'enum {size = ...;}'のように 'allocator 'クラスを使うことができるので、' Allocator :: size'としてアクセスすることができますが、すべてのallocator内で 'size'定数を定義する必要があります。 –

+0

ありがとう、私は静的constアプローチについても考えました。 – Arun

関連する問題