2011-07-04 17 views
7

Mam kod C++, który intensywnie używa shared_ptr i STL. Częstym nagłówek mówiC++ 0x std :: shared_ptr vs. boost :: shared_ptr

#include<boost/shared_ptr.hpp> 
using boost::shared_ptr; // for shared_ptr 
using namespace std;  // for STL 

chciałem przełączyć do C++ 0x teraz skorzystać z funkcji językowych, za pomocą gcc 4.6 z -std=c++0x. Istnieje również teraz std::shared_ptr, co prowadzi do niejednoznaczności dla nieokreślonego shared_ptr (boost::shared_ptr vs std::shared_ptr).

Po przełączeniu na std::shared_ptr zamiast, jak to:

#include<memory> 
using namespace std;  // for STL; also imports std::shared_ptr 

następnie otrzymuję problemy z boost::python, która działa apprently z boost::shared_ptr tylko (przynajmniej bez dalszego błahy):

/usr/include/boost/python/object/make_ptr_instance.hpp:30:52: error: no matching function for call to 'get_pointer(const std::shared_ptr<Cell>&)' 

My Pytanie brzmi:

  • jeśli e jest prostym rozwiązaniem pozwalającym rozwiązać niejednoznaczność między boost::shared_ptr i std::shared_ptr (z wyjątkiem nie używania obecnie C++ 0x), a także
  • , jeśli boost::shared_ptr ostatecznie będzie tylko aliasem dla std::shared_ptr; to automatycznie rozwiązałoby mój problem.

Dzięki!

+0

PS. za pomocą doładowania 1.42. – eudoxos

+7

Rozwiązaniem byłoby prawdopodobnie pozbyć się razem 'use namespace std'. Może to być tak proste, jak zrobienie globalnego wyszukiwania i zamiany dla każdego elementu STL. – stijn

+0

Dobrze, to byłoby rozwiązanie, ale STL jest używany tak często, że spowodowałoby, że kod byłby mniej czytelny; być może mógłbym rozważyć napisanie pęczka 'using std :: string; używając std :: vector; 'etc deklaracje we wspólnym nagłówku. W rzeczywistości nie ma wielu części 'std ::', które są używane, ale są często używane. – eudoxos

Odpowiedz

2

Musisz zdefiniować wolnostojącą funkcję 'get_pointer' dla twojej udostępnionej klasy wskaźnika, aby działała z Boost Python. (Należy pamiętać, że umożliwia to pisanie własnego udostępnionego wskaźnika i nadal działa z Boost Python: jest to świadomy wysiłek projektowy, aby zapobiec ciasnemu sprzężeniu odrębnych bibliotek Boost).

Można to uzyskać za pomocą nagłówków zgodności boost tr1, ale nie próbowałem.

http://boost.cowic.de/rc/pdf/tr1.pdf

Kiedy Boost.TR1 jest skonfigurowany do korzystania z natywnej implementacji TR1 standardowej biblioteki, to nie robi bardzo dużo: to tylko zawiera odpowiedni nagłówek.

Gdy Boost.TR1 używa implementacji Boost konkretnego komponentu, to zawiera odpowiedni nagłówek Boost i importuje niezbędne deklaracje w przestrzeni nazw std :: tr1 przy użyciu deklaracji. Zauważ, że tylko te deklaracje, które są częścią standardu, są importowane: implementacja jest celowo dość rygorystyczna, ponieważ nie obejmuje żadnych rozszerzeń specyficznych dla Boost w przestrzeni nazw std :: tr1, w celu wychwycenia błędów przenośności w kodzie użytkownika. Jeśli naprawdę potrzebujesz użyć rozszerzeń specyficznych dla Boost, to powinieneś bezpośrednio dołączyć nagłówki Boost i użyć deklaracji w boostu przestrzeni nazw :: zamiast tego. Zauważ, że ten styl implementacji nie jest całkowicie zgodny ze standardami, w szczególności nie jest możliwe dodawanie zdefiniowanych przez użytkownika szablonów specjalizacyjnych komponentów TR1 do przestrzeni nazw std :: tr1. Istnieją również jedna lub dwie biblioteki Boost, które nie są jeszcze w pełni zgodne z normami, wszelkie takie niezgodności są udokumentowane w sekcji TR1 według tematu.Mamy nadzieję, że wystąpienia niestandardowego zachowania powinny być w praktyce niezwykle rzadkie.

Jeśli używasz standard zgodny nagłówek zawiera (w Boost/TR1/TR1), to te nazwy nagłówka może czasami konflikt z istniejącym nagłówki biblioteki standardowej (np shared_ptr jest dodawany do istniejącego standardowego nagłówka biblioteki zamiast to własny nagłówek). Nagłówki te przechodzą do istniejącego standardowego nagłówka biblioteki na jeden z dwóch sposobów: dla gcc używa #include_next, , a dla innych kompilatorów używa makra BOOST_TR1_STD_HEADER (nagłówek) (zdefiniowanego w boost/tr1/detail/config.hpp), który ocenia na #include < ../ include/header>. Powinno to działać "prosto z pudełka" dla większości kompilatorów, ale oznacza, że ​​te nagłówki nigdy nie powinny być umieszczane w katalogu o nazwie "include", który znajduje się już w ścieżce wyszukiwania kompilatora.

+0

Dzięki! Myślałem, że byłoby to bardziej skomplikowane z boost :: python. No cóż, teraz używam też boost :: serialization i nie wydaje się być tak elastyczny (np. [This thread] (http://stackoverflow.com/questions/4094604/boost-serialization-serialize-stdtr1shared-ptr) sugeruje kopiowanie i dostosowywanie tego, co boost :: serialization robi dla boost :: shared_ptr. – eudoxos

Powiązane problemy