(Utilizzo di Visual Studio 2010) Sto tentando di creare un shared_ptr di una classe esistente nel mio progetto (la classe è stata scritta un decennio prima che esistesse std :: shared_ptr). Questa classe accetta un puntatore non-const su un altro oggetto, il suo costruttore di parametro vuoto è privato.Errori in std :: make_shared() quando si tenta di rendere shared_ptr?
class Foobar {
public:
Foobar(Baz* rBaz);
private:
Foobar();
}
Quando cerco di creare uno shared_ptr ad esso, le cose non vanno bene:
Baz* myBaz = new Baz();
std::shared_ptr<Foobar> sharedFoo = std::make_shared<Foobar>(new Foobar(myBaz));
In VS2010, questo mi dà
error C2664: 'Foobar::Foobar(const Foobar &)' : cannot convert parameter 1 from 'Foobar *' to 'const Foobar &'
3> Reason: cannot convert from 'Foobar *' to 'const Foobar'
Per qualche ragione sembra chiamare il costruttore di copie di Foobar
anziché il costruttore che accetta uno Baz*
.
Non sono nemmeno sicuro della parte cannot convert from 'Foobar *' to 'const Foobar'
. La mia migliore interpretazione è che il mio tipo di modello di shared_ptr<Foobar>
è errato. L'ho fatto shared_ptr<Foobar*>
ma questo sembra sbagliato, tutti gli esempi che ho visto non rendono il tipo un puntatore crudo.
Sembra che la compilazione di tutto shared_ptr<Foobar*>
compaia correttamente, ma impedirà che l'oggetto Foobar
venga cancellato correttamente quando tutti gli shared_ptr
sono fuori portata?
Edit: Questo sembra essere legata, ma non sto usando Boost: boost make_shared takes in a const reference. Any way to get around this?
Edit2: Per chiarezza, se vi state chiedendo il motivo per cui sto usando make_shared()
, nel mio codice effettivo sharedFoo
variabile è un membro classe di una terza classe (indipendente da Foobar
e Baz
).
Non riesco a testare atm, ma non dovrebbe essere così; std :: shared_ptr sharedFoo = std :: make_shared (myBaz); –
Ah! Questo ha fatto il trucco ... apparentemente 'make_shared()' chiama per te il costruttore del tipo di modello, quindi non avrei dovuto passare in un oggetto 'new'ed. Grazie! Dillo di nuovo come risposta e la contrassegnerò come corretta. –
Fatto, dopo essere stato in grado di testarlo da solo :) –