2016-11-30 2 views
0

Ich möchte wie unten ein zweidimensionales Array verwalten:
unique_ptr mit Vektor: Fehler: Aufruf zu implizit gelöscht Copykonstruktor von XXX

std::vector<std::unique_ptr<int []>> vec(5, nullptr); 
vec[0] = std::make_unique<int []>(3); 
vec[1] = std::make_unique<int []>(4); 
... 

Jedoch habe ich einen Fehler:

error: call to implicitly-deleted copy constructor of 'std::__1::unique_ptr< int [], std::__1::default_delete< int []> >'

+0

Gibt es einen Grund, warum Sie nicht 'std :: vector >' tun? – Galik

+0

@Galik Nein. Aber ich brauche nur ein Array mit fester Größe, also verwende ich das RAW-Array. – Yves

Antwort

4

Ich glaube, das Problem mit Ihrem vector constructor call (2 : Füllkonstruktor):

std::vector<std::unique_ptr<int []>> vec(5, nullptr); 

Hier, y Sie nennen im Wesentlichen vector(size_t(5), std::unique_ptr<int[]>(nullptr)). Beachten Sie, dass dies eine temporäre Instanz von std::unique_ptr erstellt, die implizit aus Ihrem Argument nullptr konvertiert/konstruiert wurde. Der vector-Konstruktor soll dann diesen Wert kopieren, den Sie an ihn n Mal übergeben, um den Container auszufüllen; Da Sie keine unique_ptr (sogar eine Null) kopieren können, erhalten Sie Ihren Compilerfehler innerhalb des Konstruktorcodes.

Wenn Sie sofort diese anfänglichen nullptr Werte ersetzen, sollten Sie nur ein leeres vector und push_back Ihre neue Elemente konstruieren:

std::vector<std::unique_ptr<int []>> vec; // default constructor 
vec.push_back(std::make_unique<int []>(3)); // push the elements (only uses the move 
vec.push_back(std::make_unique<int []>(4)); // constructor of the temporary) 
... 

Um eine vector mit einer bestimmten Anzahl von Nullwerten initialisiert werden, lassen Sie den zweiten Parameter :

std::vector<std::unique_ptr<int []>> vec(5); 

Dies wird jedes unique_ptr mit dem default constructor, nicht erforderlich ist jegliches Kopieren konstruieren.

-2

Sie fügen Integer-Elemente in das erwartete Array ein.

+2

bist du sicher? Ich denke nicht. – Yves

+0

Sie definieren einen Vektor, der unique_ptr für Array ** int [] ** erhält, und wenn Sie vec [0] verwenden, erwartet er eine int [] Variable. –

+2

http://en.cppreference.com/w/cpp/memory/unique_ptr/make_unique – Yves

2
std::vector<std::unique_ptr<int []>> vec(5, nullptr); 

Diese Kopie Leitung 5 std::unique_ptr<int []> aus einem aus nullptr konstruiert temporären konstruieren. Es ist illegal.

Ich glaube, Sie dies wünschen:

std::vector<std::unique_ptr<int []>> vec; 
vec.reserve(5); 
vec.push_back(std::make_unique<int []>(std::size_t(3))); 

Wenn Sie wirklich einen Vektor mit 5 nullptr wollen, hier ist die Lösung:

std::vector<std::unique_ptr<int []>> vec(5); 
vec[0] = std::make_unique<int []>(std::size_t(3)); 
Verwandte Themen