2015-10-27 9 views
5

Entschuldigung, ich kann den spezifischen Code nicht einfügen.
Ich hoffe, diese kleine Probe ist genug:Warum möchte std :: list meinen Zuweiser ohne Argumente aufrufen?

Lassen Sie uns sagen, dass ich ein allocator wie dieses:

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 
}; 

Und wie diese genutzt werden:

MyAllocObject object; 
MyAllocator<int> myAlloc(object); 
std::list<int, MyAllocator<int> > list(myAlloc); 

ich erfahren, dass, wenn die Standard Konstruktor fehlt, der Code kompiliert nicht, also habe ich ihn hinzugefügt.
Aber das Problem ist, dass ich auf dieses Argument angewiesen bin, weil das ist, was ich für meine benutzerdefinierten Speicherzuweisungen verwende.

Was kann ich in diesem Fall tun?

+3

Bevor C++ 11, mußte Verteilern b wie zwei Instanzen des gleichen Typs, unabhängig davon, wie sie initialisiert wurden, mussten austauschbar sein. (Diese Anforderung stammt aus dem Verschieben von Elementen von einem Container zu einem anderen) C++ 11 fügt Anforderung für Stateful Allokatoren hinzu. Vor C++ 11 mußten sich die Zuweisungseinrichtungen als wenn statlos verhalten, d. H. Zwei Instanzen des gleichen Typs, egal wie sie initialisiert wurden, mußten austauschbar sein. C++ 11 fügt Anforderung für Stateful Allokatoren hinzu: http://stackoverflow.com/questions/6861046/compiler-support-for-stateful-allocators-in-stl-containers – peterchen

+1

Mit welcher Plattform, mit welchem ​​Compiler und mit welchen Optionen arbeiten Sie? – Niall

+0

@Niall: Ich wollte ein bisschen vor dem Posten als Antwort erweitern. Fertig :) - Leider konnte ich kein nettes Intro finden, um Stateful Allokatoren zu verwenden. – peterchen

Antwort

2

Vor C++ 11 war es STL-Implementierungen erlaubt, dass sich die Zuweisungsberechtigten so verhalten mussten, als wären sie zustandslos.

"verhalten sich wie-wenn staatenlos" bedeutet STL auf die folgende verlassen konnte arbeiten:

MyAllocator a1; 
void * p = a1.allocate(77, 0); 

MyAllocator a2; 
a2.free(p); 

(IIRC diese Umsetzung einiger Container-Operationen vereinfacht.)

„durften require " bedeutet STL-Implementierung könnte Stateful Allokatoren unterstützen (wie Ihre), musste aber nicht.


C++ 11 erfordert Unterstützung für Stateful Allokatoren.
Ich konnte jedoch keine schnelle Einführung dazu finden (jemand will das hinzufügen?) This thread might give you some leads.


Wenn Sie an einen bestimmten Compiler gebunden sind, die nicht Stateful Verteilern unterstützt, haben Sie ein paar nicht so glänzend Optionen:

  • einen Verweis auf Ihren Zustand als Template-Argument der allocator
  • in Ihrer Zuordnung, einen back-Link zu dem Allocator in Frage enthält (in der Regel zerstört der Zweck ein benutzerdefiniertes Allocator für kleine Daten)