2016-08-23 9 views
5

मैं निर्माता में एक boost::shared_ptr<std::vector<std::string> > vec प्रारंभ एक boost::shared_ptr<std::list<std::string> > list के साथ इस सूची को प्रारंभ चाहते हैं?आरंभ किया जा रहा बढ़ावा :: shared_ptr <std :: वेक्टर <T>> बढ़ावा :: shared_ptr साथ <std::list<T>>

क्या यह संभव है?

Test.hpp

class Test 
{ 
public: 
    Test(boost::shared_ptr<std::list<std::string> > list); 

private: 
    boost::shared_ptr<std::vector<std::string> > vec; 
}; 

Test.cpp

Test::Test(boost::shared_ptr<std::list<std::string> > list) : vec(list->begin(), list->end()) 
{ 
} 

त्रुटि संदेश के भाग:

मैं इस कोशिश की

Test.cpp: In constructor ‘Test::Test(boost::shared_ptr<std::list<std::basic_string<char> > >)’: 
Test.cpp:6:85: error: no matching function for call to ‘boost::shared_ptr<std::vector<std::basic_string<char> > >::shared_ptr(std::list<std::basic_string<char> >::iterator, std::list<std::basic_string<char> >::iterator)’ 
+1

नहीं:

आदर्श रूप में, अपने कोड की तरह दिखना चाहिए। ये विभिन्न प्रकार हैं। आपको वेक्टर बनाना होगा और सूची सामग्री को कॉपी करना होगा। –

+2

हालांकि साझा पॉइंटर्स के कंटेनरों के लिए वैध मामले हैं, क्या आप वाकई साझा जीवनकाल और गतिशील आवंटन ef कंटेनर की आवश्यकता है? – TartanLlama

+3

बस एक टिप्पणी: 'boost :: shared_ptr' इतिहास है। इसके बजाए सी ++ 11 मानक सुविधाओं का उपयोग करें: 'std :: shared_ptr'। – rustyx

उत्तर

9

बदलें:

vec(list->begin(), list->end()) 

साथ:

vec(boost::make_shared(list->begin(), list->end())) 

आपका निर्माता चाहिए लगता है कि:

Test::Test(const boost::shared_ptr<std::list<std::string> >& list) : 
    vec(boost::make_shared(list->begin(), list->end())){ 
} 

ध्यान रखें कि आप std::vector को std::list से डेटा कॉपी कर रहे हैं।

यदि आप कम महंगी समाधान चाहते हैं, तो आप उन्हें std::make_move_iterator का उपयोग करके स्थानांतरित कर सकते हैं। हालांकि, चूंकि आप अभी भी मजबूत स्मार्ट पॉइंटर्स का उपयोग कर रहे हैं, मुझे लगता है कि आपके पास इसका उपयोग नहीं है।

संपादित करें:

यह काम नहीं किया है, तो यह प्रयास करें:

vec(boost::make_shared<std::vector<std::string>>(list->begin(), list->end())) 

संपादित करें 2:

आदेश nullptr मामले को कवर करने के लिए के रूप में यह @Maxim द्वारा उल्लेख किया गया था एगोरशकिन:

class Test{ 
public: 
    Test(const boost::shared_ptr<std::list<std::string> >& list); 

private: 
    boost::shared_ptr<std::vector<std::string> > convert_to_vec(const boost::shared_ptr<std::list<std::string> >& lst) const; 
    boost::shared_ptr<std::vector<std::string> > vec; 
}; 

//in .cpp 
Test::Test(const boost::shared_ptr<std::list<std::string> >& list): 
    vec(convert_to_vec(list)){ 
} 
boost::shared_ptr<std::vector<std::string> > Test::convert_to_vec(const boost::shared_ptr<std::list<std::string> >& lst) const{ 
    if(lst!=nullptr){ 
     return boost::make_shared<std::vector<std::string>>(list->begin(), list->end()); 
    } 
    return nullptr; 
} 
+2

मैं सुझाव दूंगा कि निर्माता को केवल' const std :: list और ' इसे सूची के जीवनकाल के बारे में जानने की आवश्यकता नहीं है।मैं सिर्फ सवाल का जवाब देता हूं :) – TartanLlama

+0

मुझे यह त्रुटि संदेश मिला: 'test.cpp: कन्स्ट्रक्टर में 'टेस्ट :: टेस्ट (कॉन्स बूस्ट :: shared_ptr >> &) ': Test.cpp: 6: 123: त्रुटि:' make_shared (std :: list > :: iterator, std :: list > :: को कॉल करने के लिए कोई मिलान करने वाला फ़ंक्शन नहीं: इटेटरेटर) ' – tmsblgh

+1

@tmsblgh' boost :: make_shared > (list-> start(), list-> end()) '' प्रयास करें। – TartanLlama

3

एक साइड नोट के रूप में: यह स्पष्ट नहीं है कि निर्माता shared_ptr<X> क्यों लेता है लेकिन shared_ptr<X> का उपयोग नहीं करता है। इसे इसके बजाय X& लेना चाहिए। यदि संभव हो तो स्मार्ट पॉइंटर्स का उपयोग करने से बचें।

class Test 
{ 
public: 
    Test(std::list<std::string> const& list) 
     : vec(list.begin(), list.end()) 
    {} 

private: 
    std::vector<std::string> vec; 
}; 
बेशक
+0

क्या मुझे केवल std :: list और सूची पास करने की आवश्यकता है? Shared_ptr का उपयोग करना "सुरक्षित" और "सस्ता" नहीं है? – tmsblgh

+2

हां, 'std :: सूची कॉन्स और सूची 'पास करें, यदि संभव हो तो' shared_ptr 'के आसपास से बचने से बचें। और यदि संभव हो तो 'shared_ptr' सदस्यों को रखने से बचें। –

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