Sto cercando di associare nuovamente il mio tipo allocatore personalizzato, MyAllocator<foo>
, per l'uso in una classe basic_string
, ad esempio:Lo std :: allocator_traits definisce rebind_alloc se rebind non è presente nell'allocatore personalizzato?
std::basic_string<char, std::char_traits<char>, MyAllocator<char>> ...
L'allocatore viene passato al contesto come MyAllocator<void>
, quindi ho bisogno di associare nuovamente l'allocatore .
Dalla pagina cppreference per std::allocator_traits
, http://en.cppreference.com/w/cpp/memory/allocator_traits:
gli alias modelli:
rebind_alloc<T>
:Alloc::rebind<T>::other
se presenti, altrimentiAlloc<T, Args>
se questo Alloc èAlloc<U, Args>
miei attrezzi allocatore personalizzato allocator_traits
, ma non definisce la struttura di rebind (che non è un è necessario essere in grado di implementare allocator_traits
). La mia comprensione della documentazione è che deve comprendere allocator_traits
rebind_alloc
. Tuttavia, se cerco di chiamare rebind_alloc
sul mio tipo allocatore personalizzato:
template<typename T>
using RebindAlloc =
typename std::allocator_traits<MyAllocator<void>>::template rebind_alloc<T>;
ottengo vari errori di compilazione quando si tenta di passare RebindAlloc<char>
al tipo basic_string
:
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;
Chiaramente la documentazione mi ha ingannato. Dovrei semplicemente rinunciare allo rebind_alloc
e implementare il rebind nell'allocatore personalizzato, oppure esiste un modo corretto di farlo usando allocator_traits
?
Sto utilizzando gcc 4.8 con C++ 11. 14 non è un'opzione al momento.
Ecco un frammento di codice di quello che sto cercando di fare: https://gist.github.com/jacquelinekay/0cee73d1d2d78d8edd31
puoi pubblicare un minimo (quasi) esempio compilabile che posso collegarlo il mio compilatore per controllare? –
L'ho modificato con uno snippet di codice che dovrebbe essere valido, tranne per l'errore di compilazione menzionato nel post originale che non riesco a capire. – Jackie
@Jackie compila bene a partire da gcc 5.1 –