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 einernew
'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 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Werden sollten;
...da make_shared Konstrukte, die das eigentliche Objekt für Sie durch ausführen des Konstruktors.