Siamo spiacenti, non è possibile incollare il codice specifico.
Spero che questo piccolo esempio è sufficiente:Perché std :: list desidera chiamare il mio allocatore senza argomenti?
Diciamo che ho un allocatore come questo:
template <class T>
class MyAllocator
{
// ... typedefs
MyAllocObject _allocObject;
public:
MyAllocator() {
// _allocObject = new ..
}
MyAllocator(const MyAllocator& alloc) {
_allocObject = alloc.getAllocObject();
}
template <class U>
MyAllocator(const MyAllocator<U>& alloc) {
_allocObject = alloc.getAllocObject();
}
MyAllocator(const MyAllocObject& allocObject) {
_allocObject = allocObject;
}
inline pointer allocate(size_type size) {
return _allocObject->alloc(size);
}
// other functions
};
ed è usato in questo modo:
MyAllocObject object;
MyAllocator<int> myAlloc(object);
std::list<int, MyAllocator<int> > list(myAlloc);
ho sperimentato, che se il default manca il costruttore, il codice non viene compilato, quindi l'ho aggiunto.
Ma il problema è che io dipendo da quell'argomento, perché è quello che uso per le mie allocazioni di memoria personalizzate.
Cosa posso fare in questo caso?
Prima di C++ 11, allocatori dovevano b come se fosse apolide, cioè due istanze dello stesso tipo, non importa come fossero intializzate, dovevano essere scambiabili. (Questo requisito deriva dallo spostamento di elementi da un contenitore a un altro) C++ 11 aggiunge il requisito per gli allocatori di stato. Prima del C++ 11, gli allocatori dovevano comportarsi come se fossero apolidi, cioè due istanze dello stesso tipo, indipendentemente da come erano intializzate, dovevano essere scambiabili. C++ 11 aggiunge il requisito per gli allocatori di stato: http://stackoverflow.com/questions/6861046/compiler-support-for-stateful-allocators-in-stl-containers – peterchen
Con quale piattaforma, compilatore e opzioni stai lavorando? – Niall
@Niall: volevo espandere un po 'prima di postare come risposta. Fatto :) - sfortunatamente, non sono riuscito a trovare una bella introduzione all'uso degli allocatori di stato. – peterchen