C++ unique_ptr et carte

Je suis en train d'utiliser le C++0x unique_ptr de la classe à l'intérieur d'un map comme suit:

//compile with `g++ main.cpp -std=gnu++0x`

#include <string.h>    
#include <map>
#include <memory>

using namespace std;

struct Foo {
    char *str;    
    Foo(char const *str_): str(strdup(str_)) {}
};

int main(void) {
    typedef std::map<int, unique_ptr<Foo>> Bar;
    Bar bar;
    auto a = bar.insert(Bar::value_type(1, new Foo("one")));
    return 0;
}

Cependant GCC me donne l'erreur suivante (raccourcis, je pense que c'est la partie pertinente, merci de les tester sur votre propre compilateur C++):

principal.rpc:19: instancié à partir d'ici 
/usr/include/c++/4.4/bits/unique_ptr.h:214: erreur: supprimé la fonction ‘std::unique_ptr::unique_ptr(const std::unique_ptr&) [avec _Tp = Foo, _Tp_Deleter = std::default_delete]’ 
/usr/include/c++/4.4/bits/stl_pair.h:68: erreur: utilisé ici 

Je ne suis vraiment pas sûr de ce que j'ai fait de mal, cela fonctionne sur MSVC. J'ai trouvé très similaire questions, qui semblent identiques, mais leurs solutions ne fonctionnent pas pour moi.

matt@stanley:/media/data/src/c++0x-test$ gcc --version 
gcc-4.4.réel (Ubuntu 4.4.3-4ubuntu5) 4.4.3 
  • Pas la réponse, mais Foo doit avoir un destructeur qui libère str parce que strdup mallocs de la mémoire et des copies str_ dans cette mémoire.
  • C'est C++0x, peu importe quand il est officiellement publié. Comme Stroustrup mettre, pense de x comme une hexadécimal 🙂
  • Merci pour cette bonne idée 😀
  • Franco: Oui, je sais, ce serait la prochaine à mettre en œuvre, mais je n'ai jamais fait cela loin (c'est simplifié, extrait d'un plus grand problème, je vais avoir).
  • Vous devez ajouter un destructeur Foo::~Foo qui libère de la mémoire et de désactiver explicitement toute copie.
InformationsquelleAutor Matt Joiner | 2010-10-11