2016-08-23 5 views
5

Ich möchte eine boost::shared_ptr<std::vector<std::string> > vec in der Konstruktor initialisieren Liste mit einem boost::shared_ptr<std::list<std::string> > list initialisieren?Boost initialisieren :: shared_ptr <std :: vector <T>> mit boost :: shared_ptr <std::list<T>>

Ist es möglich?

Ich versuchte dies:

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()) 
{ 
} 

Teil der Fehlermeldung:

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

Natürlich nicht. Dies sind verschiedene Arten. Sie müssen den Vektor erstellen und den Listeninhalt dorthin kopieren. –

+2

Obwohl es gültige Fälle für gemeinsam genutzte Zeiger auf Container gibt, sind Sie sicher, dass Sie hier Container für die gemeinsame Lebensdauer und die dynamische Zuweisung von Ef-Containern benötigen? – TartanLlama

+3

Nur eine Bemerkung: 'boost :: shared_ptr' ist Geschichte. Verwenden Sie stattdessen C++ 11-Standardfunktionen: 'std :: shared_ptr'. – rustyx

Antwort

9

ersetzen:

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

mit:

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

Ihr Konstruktor sollte wie folgt aussieht:

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

Beachten Sie, dass Sie die Daten aus dem std::list zum std::vector kopieren.

Wenn Sie eine günstigere Lösung wünschen, können Sie sie mit std::make_move_iterator verschieben. Da Sie jedoch immer noch Smart-Pointer verwenden, habe ich keinen Zugriff darauf.

Edit:

wenn es nicht versuchen, diese funktioniert:

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

Edit 2:

Um den nullptr Fall abzudecken, wie es von @Maxim erwähnt wurde Egorushkin:

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

Ich würde vorschlagen, dass der Konstruktor sollte einfach eine 'const std :: list &', als es sollte nicht über die Lebensdauer der Liste wissen müssen.Ich verstehe, nur die Frage zu beantworten :) – TartanLlama

+0

Ich habe diese Fehlermeldung: 'Test.cpp: Im Konstruktor 'Test :: Test (const boost :: shared_ptr >> &) ': Test.cpp: 6: 123: Fehler: keine übereinstimmende Funktion für den Aufruf von' make_shared (std :: list > :: iterator, std :: list > :: Iterator) ' – tmsblgh

+1

@tmsblgh Versuchen Sie 'boost :: make_shared > (list-> begin(), list-> end())'. – TartanLlama

3

Als eine Randnotiz: Es ist nicht klar, warum der Konstruktor shared_ptr<X>, aber nicht die shared_ptr<X> verwendet. Es sollte stattdessen X& dauern. Vermeiden Sie möglichst Smart-Pointer.

Idealerweise sollte der Code wie folgt aussehen:

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

private: 
    std::vector<std::string> vec; 
}; 
+0

Muss ich nur Std :: Liste & Liste übergeben? Shared_ptr ist nicht "sicherer" & "billiger"? – tmsblgh

+2

Ja, pass ''std :: list const & list', wenn möglich, vermeide' shared_ptr's herumzugehen. Und vermeiden Sie möglichst 'shared_ptr'-Mitglieder. –

Verwandte Themen