2012-01-09 17 views
5

(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).

+1

Non riesco a testare atm, ma non dovrebbe essere così; std :: shared_ptr sharedFoo = std :: make_shared (myBaz); –

+0

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. –

+0

Fatto, dopo essere stato in grado di testarlo da solo :) –

risposta

8

Che dovrebbe essere;

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

... poiché make_shared costruisce l'oggetto reale eseguendo il costruttore.

Problemi correlati