Schrompf hat geschrieben:Jetzt nach Wechsel zu Visual Studio 2015 geht das nicht mehr. Anscheinend kompiliert der jetzt die Templates richtig, anstatt sie nur textuell einzusetzen wie bisher. Und damit wird auch die nicht benutzte Funktion resize() instanziiert, wodurch der Compiler Copy- oder Move-Konstruktor braucht und sich darob beschwert.
Der C++ Standard schreibt (für den Fall der impliziten Spezialisierung eines Klassentemplate) vor, dass die Definition einer Memberfunktion nur instanziert wird, wenn die Memberfunktion auch benutzt wird. Das Problem liegt bereits in der Verwendung von
reserve() und
emplace_back(). Beide Funktionen müssen potentiell eine Reallokation des internen Buffers durchführen und dabei den Inhalt des Arrays vom alten in den neuen Buffer moven, es ist für diese beiden Funktionen daher (auch laut Standard) notwendig, dass der im vector gespeicherte Typ zumindest Moveable ist. Ich kann ehrlich gesagt nicht ganz nachvollziehen, wie der Code so jemals kompiliert haben soll.
Schrompf hat geschrieben:Eigenen Speicher und Placement New wäre aktuell die einzige Option, die mir einfällt, aber da gibt's sicher was Kluges.
Ich fürchte, wenn du die Objekte zusammehängend im Speicher liegen haben willst, wird es wohl oder übel darauf hinauslaufen. Ansonsten einfach
std::list verwenden... ;)