2012-01-09 13 views
5

(Visual Studio 2010'u Kullanma) Projemde var olan bir sınıfın bir paylaşımlı_ptr'si oluşturmaya çalışıyorum (std :: shared_ptr önce bir on yıl yazıldı). Bu sınıf, bir const olmayan işaretçiyi başka bir nesneye alır, boş parametre yapıcısı özeldir. Ben buna bir Shared_ptr oluşturmaya çalıştığınızdashared_ptr yapmaya çalışırken std :: make_shared() hataları?

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

private: 
    Foobar(); 
} 

, işler yolunda gitmez:

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

, işte bu görünen Nedense bana

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

verir Baz* alır yapıcı yerine Foobar kopya kurucusunu çağırıyor. Ayrıca, cannot convert from 'Foobar *' to 'const Foobar' bölümünden de emin değilim. En iyi yorumum, shared_ptr<Foobar> numaralı şablonumun yanlış olmasıdır. shared_ptr<Foobar*> yaptım ama bu yanlış görünüyor, gördüğüm tüm örnekler tür bir ham işaretçi yapmayın.

Bu, shared_ptr<Foobar*> herşeyi düzgün bir şekilde derler, ancak Foobar nesnesinin kapsam dışına çıkması durumunda düzgün şekilde silinmesini engeller mi?

Düzenleme: Bu ilgili görünen, ama Boost kullanmıyorum: Ben make_shared() kullanıyorum neden benim gerçek kod sharedFoo yılında, merak ediyorsanız eğer, Anlaşılır olması için: boost make_shared takes in a const reference. Any way to get around this?

Edit2 değişken, bir üçüncü sınıfın (Foobar ve Baz'dan bağımsız) bir sınıf üyesidir.

+1

Atm'ı test edemiyorum, fakat bu olmamalı; std :: shared_ptr sharedFoo = std :: make_shared (myBaz); –

+0

Ah! Bu hile yaptı ... görünüşe göre 'make_shared() 'sizin için şablon yazılan türünü çağırır, bu yüzden' yeni 'bir nesneye geçmemeliydim. Teşekkürler! Bir cevap olarak tekrar söyleyin ve doğru olarak işaretleyeceğim. –

+0

Bitti, kendim test edildikten sonra :) –

cevap

8

Bu;

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

... make_shared kurucuyu çalıştırarak sizin için asıl nesneyi oluşturduğundan.