Fehler in std::make_shared (), wenn Sie versuchen zu machen shared_ptr?

(Mit Visual Studio 2010), die ich versuche zu schaffen, ein shared_ptr einer vorhandenen Klasse in meinem Projekt (Klasse geschrieben wurde, ein Jahrzehnt, bevor std::shared_ptr gab). Diese Klasse nimmt eine nicht-const-Zeiger auf ein anderes Objekt, es kann leer sein parameter-Konstruktor ist private.

class Foobar {
public:
    Foobar(Baz* rBaz);

private:
    Foobar();
}

Wenn ich versuche zu erstellen, die einen shared_ptr zu es, die Dinge nicht gut gehen:

Baz* myBaz = new Baz();
std::shared_ptr<Foobar> sharedFoo = std::make_shared<Foobar>(new Foobar(myBaz));

Auf VS2010, das gibt mir

error C2664: 'Foobar::Foobar(const Foobar &)' : cannot convert parameter 1 from 'Foobar *' to 'const Foobar &'
3>          Reason: cannot convert from 'Foobar *' to 'const Foobar'

Aus irgendeinem Grund scheint es zu sein, den Aufruf des copy-Konstruktors der Foobar statt der Konstruktor, eine Baz*.

Ich bin auch nicht sicher über die cannot convert from 'Foobar *' to 'const Foobar' Teil. Meine beste interpretation ist, dass meine Vorlagen-Typ shared_ptr<Foobar> ist falsch. Ich habe es shared_ptr<Foobar*> aber das scheint mir falsch, alle Beispiele, die ich gesehen habe, machen Sie nicht den Typ ein raw-pointer.

Scheint es, dass alles shared_ptr<Foobar*> ordnungsgemäß kompiliert, sondern wird verhindern, dass die Foobar Objekt aus immer korrekt gelöscht, wenn alle shared_ptr's go out of scope?

Edit: Dies scheint im Zusammenhang, aber ich bin nicht mit Boost: boost make_shared nimmt in einer const-Referenz. Jeder Weg, dies zu umgehen?

Edit2: Für Klarheit, wenn Sie sich Fragen, warum ich bin mit make_shared(), in meinem eigentlichen code der sharedFoo variable ist, eine Klasse von einer Dritten Klasse (unabhängig von Foobar und Baz).

  • Ich kann das nicht testen atm, aber sollte das nicht sein; std::shared_ptr<Foobar> sharedFoo = std::make_shared<Foobar>(myBaz);
  • Ah! Das war der trick... anscheinend make_shared() ruft den Konstruktor der Vorlagen-Typ für Sie, also sollte ich nicht haben Weitergabe in einer new'ed Objekt. Danke! Sagen Sie, dass wieder so eine Antwort, und ich werde markieren Sie es als richtig.
  • Gemacht, nachdem er in der Lage, test es selber 🙂
InformationsquelleAutor Bret Kuhns | 2012-01-09
Schreibe einen Kommentar