2016-04-24 4 views
3

J'essaie de fusionner deux vecteurs de unique_ptr (c'est-à-dire std::move entre eux d'un et dans un autre) et je continue à courir dans une "utilisation de la fonction supprimée ... "mur de texte d'erreur. Selon l'erreur, j'essaie apparemment d'utiliser le constructeur de copie supprimé unique_ptr, mais je ne sais pas pourquoi. Ci-dessous le code:'utilisation de la fonction supprimée' lors de la fusion de deux vecteurs de 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; 
} 

Répondre

7

Vous essayez de passer d'un objet Wrapper constant. Généralement, la sémantique de déplacement nécessite également que l'objet dont vous vous déplacez soit mutable (c'est-à-dire pas const). Dans votre code le type du paramètre other dans la méthode add_all est const Wrapper&, donc other.foos fait également référence à un vecteur constant, et vous ne pouvez pas vous en éloigner.

Modifiez le type du paramètre other en Wrapper& pour le faire fonctionner.

+0

Merci! Cela semble l'avoir fait! Je suppose que la mutabilité pour la sémantique de mouvement est logique, car le vecteur d'un autre utilisateur sera invalidé. –

+0

@AUD_FOR_IUV Bienvenue dans Stack Overflow! :-) – jotik