2016-04-24 8 views
3

Ich versuche, zwei Vektoren von unique_ptr (dh std::move sie aus einem und in ein anderes) zu verschmelzen und ich laufe in eine "Verwendung der gelöschten Funktion ... "Wand des Fehlertextes. Entsprechend dem Fehler, versuche ich anscheinend unique_ptr 's gelöschten Kopiekonstruktor zu benutzen, aber ich bin nicht sicher, warum. Unten ist der Code:'Verwendung der gelöschten Funktion' beim Zusammenführen zweier Vektoren von unique_ptr

#include <vector> 
#include <memory> 
#include <algorithm> 
#include <iterator> 

struct Foo { 
    int f; 

    Foo(int f) : f(f) {} 
}; 

struct Wrapper { 
    std::vector<std::unique_ptr<Foo>> foos; 

    void add(std::unique_ptr<Foo> foo) { 
     foos.push_back(std::move(foo)); 
    } 

    void add_all(const Wrapper& other) { 
     foos.reserve(foos.size() + other.foos.size()); 

     // This is the offending line 
     std::move(other.foos.begin(), 
        other.foos.end(), 
        std::back_inserter(foos)); 
    } 
}; 

int main() { 
    Wrapper w1; 
    Wrapper w2; 

    std::unique_ptr<Foo> foo1(new Foo(1)); 
    std::unique_ptr<Foo> foo2(new Foo(2)); 

    w1.add(std::move(foo1)); 
    w2.add(std::move(foo2)); 

    return 0; 
} 

Antwort

7

Sie versuchen, von einem konstanten Wrapper Objekt zu bewegen. Im Allgemeinen erfordert die Bewegungssemantik auch, dass das Objekt, von dem Sie weggehen, veränderbar ist (d. H. Nicht const). In Ihrem Code ist der Typ des other Parameters in der add_all Methode const Wrapper&, daher bezieht sich other.foos auch auf einen konstanten Vektor, und Sie können sich nicht davon entfernen.

Ändern Sie den Typ des Parameters other in Wrapper&, damit es funktioniert.

+0

Vielen Dank! Das scheint es getan zu haben! Ich nehme an, dass die Veränderlichkeit für die Bewegungssemantik sinnvoll ist, da der Vektor anderer als Ergebnis ungültig wird. –

+0

@AUD_FOR_IUV Willkommen bei Stack Overflow! :-) – jotik