2015-10-21 1 views
7

私は例えば、basic_stringクラスで使用するために、私のカスタムアロケータタイプ、MyAllocator<foo>を再バインドしようとしている:rebindがカスタムアロケータに存在しない場合、std :: allocator_traitsはreb​​ind_allocを定義しますか?

std::basic_string<char, std::char_traits<char>, MyAllocator<char>> ...

をアロケータがMyAllocator<void>としてコンテキストに渡されたので、私はアロケータを再バインドする必要がありますされます。

メンバーのエイリアステンプレート:

rebind_alloc<T>std::allocator_traitshttp://en.cppreference.com/w/cpp/memory/allocator_traits用cppreferenceページから

Alloc::rebind<T>::other存在する場合、それ以外の場合はAlloc<T, Args>これのAllocはAlloc<U, Args>

マイカスタムアロケータの実装であればallocator_traitsですが、リバインド構造体は定義されていません( ppearはallocator_traitsを実装するための要件となります)。私の文書の理解は、allocator_traitsrebind_allocを理解しなければならないということです。私はbasic_string型にRebindAlloc<char>を渡すしようとしたとき、私は、さまざまなコンパイルエラーを取得

template<typename T> 
using RebindAlloc = 
    typename std::allocator_traits<MyAllocator<void>>::template rebind_alloc<T>; 

::私は私のカスタムアロケータタイプにrebind_allocを呼び出してしようとした場合しかし、

In file included from /usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/string:52: 
/usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/bits/basic_string.h:114:41: error: 
    'rebind' following the 'template' keyword does not refer to a template 
    typedef typename _Alloc::template rebind<_CharT>::other _CharT_alloc_type; 

明らかドキュメントは私を誤解しています。私はちょうどrebind_allocをあきらめて、カスタムアロケータでリバインドを実装するか、allocator_traitsを使ってこれを行う正しい方法がありますか?

gcc 4.8をC++ 11で使用しています。現在のところ、14はオプションではありません。

ここで私が何をしようとしているのコードスニペットです: https://gist.github.com/jacquelinekay/0cee73d1d2d78d8edd31

+0

に文字列で使用されていないので、だからあなたのアロケータは、あなたが(ほぼ)私はに差し込むことができますコンパイルの例を最小を投稿することができ、すべてのメンバーを定義し、C++ 03アロケータの要件を満たす必要があります。私のコンパイラはチェックする? –

+1

私は理解できない元の投稿に記載されているコンパイルエラーを除き、有効であるべきコードスニペットで編集しました。 – Jackie

+0

@Jackieは、gcc 5.1 –

答えて

4

私はC++ 11でのgcc 4.8を使用しています。

その後、あなたはGCCのbasic_stringは、バージョン5.1(およびそれからのみ、新しいABI文字列、すなわちstd::__cxx::basic_string用)まで、C++ 11のアロケータの要件をサポートしていない、あなたのアロケータでrebindを定義する必要があります。

allocator_traitsが4.8

1

n3376は[allocator.traits.types]/10で述べている:

template <class T> using rebind_alloc = see below; 

エイリアステンプレート:そのようなタイプが存在する場合はAlloc::rebind<T>::other。そうでない場合、Alloc<T, Args>AllocAlloc<U, Args>という形式のクラス・テンプレート・インスタンス化である場合、Argsは0以上の型引数です。そうでなければ、rebind_allocのインスタンス化が不正に行われます。

これはcppreferenceと一致します。それ(アロケータの特性)はC++ 11で追加されているようだから、n1905には現れません。それ以上の考古学では、どこに到着したかを検出することができますが、それだけでは関連性がありません。

この点に関しては、コンパイラが準拠したC++ 11コンパイラでないかのように見えます。

小さな修正では、both gcc 5.2.0 and clang 3.7.0 in C++11 modeはエラーなしでコードをコンパイルします。あなたのコンパイラを変更することができない場合

それは、唯一の合理的な応答を表示され、簡単なrebindを実装することです。

関連する問題