2012-01-09 16 views
5

(विजुअल स्टूडियो 2010 का उपयोग करना) मैं अपनी परियोजना में मौजूदा कक्षा का एक साझा_पीआरआर बनाने की कोशिश कर रहा हूं (वर्ग std :: shared_ptr अस्तित्व से पहले एक दशक पहले लिखा गया था)। यह वर्ग किसी अन्य ऑब्जेक्ट में गैर-कॉन्स्ट पॉइंटर लेता है, यह खाली पैरामीटर कन्स्ट्रक्टर निजी है।share_ptr बनाने की कोशिश करते समय std :: make_shared() में त्रुटियां?

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

private: 
    Foobar(); 
} 

जब मैं यह करने के लिए एक shared_ptr बनाने का प्रयास करें, चीजों को अच्छी तरह से जाना नहीं है:

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

VS2010 पर, यह मुझे

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

देता है किसी कारण यह प्रतीत होता है के लिए Baz* लेते हैं जो कन्स्ट्रक्टर के बजाय Foobar की कॉपी कन्स्ट्रक्टर को कॉल कर रहे हैं।

मुझे cannot convert from 'Foobar *' to 'const Foobar' भाग के बारे में भी निश्चित नहीं है। मेरी सबसे अच्छी व्याख्या यह है कि मेरा टेम्पलेट-प्रकार shared_ptr<Foobar> गलत है। मैंने इसे shared_ptr<Foobar*> बनाया लेकिन यह गलत लगता है, मैंने देखा है कि सभी उदाहरण एक कच्चे सूचक प्रकार नहीं बनाते हैं।

ऐसा लगता है कि सब कुछ कर रही है shared_ptr<Foobar*> ठीक से संकलित है, लेकिन यह ठीक से नष्ट कर दिया हो रही Foobar वस्तु पाएगा जब सभी shared_ptr के दायरे से बाहर जाना?

संपादित करें: यह लगता है संबंधित है, लेकिन मैं बूस्ट का उपयोग नहीं कर रहा हूँ: boost make_shared takes in a const reference. Any way to get around this?

EDIT2: स्पष्टता के लिए, यदि आप सोच रहे हैं कि मैं क्यों make_shared() उपयोग कर रहा हूँ, मेरे वास्तविक कोड sharedFoo में चर एक तीसरी कक्षा का वर्ग सदस्य है (Foobar और Baz से स्वतंत्र)।

+1

मैं एटीएम का परीक्षण नहीं कर सकता, लेकिन ऐसा नहीं होना चाहिए; std :: shared_ptr sharedFoo = std :: make_shared (myBaz); –

+0

आह! यह चाल है ... स्पष्ट रूप से 'make_shared()' आपके लिए टेम्पलेट प्रकार के निर्माता को कॉल करता है, इसलिए मुझे 'नई' ऑब्जेक्ट में गुजरना नहीं चाहिए था। धन्यवाद! फिर से एक जवाब के रूप में कहें और मैं इसे सही के रूप में चिह्नित करूंगा। –

+0

हो गया, इसे स्वयं परीक्षण करने में सक्षम होने के बाद :) –

उत्तर

8

यह होना चाहिए;

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

... के बाद से make_shared निर्माता चलाकर आप के लिए वास्तविक वस्तु निर्माण करती है।

संबंधित मुद्दे