| 分類:[C/C++]
最近、興味があってSTLのallocatorを作成しようとしています(正確に言うと、カスタム allocator を作ってみようとしています)。プログラミング言語C++第3版のp.650あたりを参考に作成してみたのですが、一つ、わからないことがあります。
allocator は(質問に関係するところだけ書くと)
template<typename T> class allocator{ public: (略) T* allocate( size_t n, allocator<void>::const_pointer hint = 0 ); ← 2番目の引数の宣言でエラーが出ます。ちなみに、void* に置き換えると OK (略) };
と書かれています。また、allocate の引数を見ると、allocator を void で特殊化してあります。なので、allocator を void で特殊化したクラスを上記のクラス宣言の後に書いてみました。
template<> class allocator<void>{ (略) };
ここで、元々のallocator のクラスで宣言されているallocateの関数定義をクラスの外で書こう思って、
template<typename T> T* HeapAllocator<T>::allocate( size_t num, HeapAllocator<void>::const_pointer ptr ) { return( 0 ); ←(テストなので、0 を戻す) }
と書いてみましたが、visualStudio 2010 でコンパイルエラーとなりました。いろいろと試してみましたが、どうやら、allocator の関数宣言のところで、 allocator<void> と allocator の特殊化したものを使おうとしているのが気に入らないようです。
コンパイルエラーを避けるだけなら、単純に、allocator<void>::pointer を void* に置き換えると良いのですが、なんだかすっきりしません。
何か、書き方が誤っているだけだと思うのですが残念ながら調べてみてもどう書くべきかさっぱりです。
こういう場合、どのように記述すると良いのかについてヒントだけでもご教授頂けると幸いです。
よろしくお願いします。
|