2011-07-04 237 views
7

我有一個C++代碼,它嚴重使用shared_ptr和STL。一個常見的頭說C++ 0x std :: shared_ptr與boost :: shared_ptr

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

我想切換到C++,現在0X利用的語言功能,使用gcc 4.6與-std=c++0x。然而現在也存在std::shared_ptr,導致未指定shared_ptrboost::shared_ptr vs std::shared_ptr)的模糊性。

當切換到std::shared_ptr代替,就像這樣:

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

boost::python然後我得到的問題,這與boost::shared_ptr apprently僅適用(至少沒有進一步擺弄):

/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>&)' 

我因此問題是

  • 如果其他e是解決boost::shared_ptrstd::shared_ptr(除非現在不使用C++ 0x)之間的模糊性的簡單解決方案,並且還有
  • 如果boost::shared_ptr最終將只是std::shared_ptr的別名;這將自動解決我的問題。

謝謝!

+0

PS。使用提升1.42。 – eudoxos

+7

該解決方案可能會擺脫'一起使用名稱空間std'。它可以像爲每個stl元素進行全局查找和替換一樣簡單。 – stijn

+0

沒錯,那將是解決方案,但STL的使用頻率很高,會使代碼更不易讀;也許我可以考慮寫一堆'使用std :: string;使用std :: vector;共同標題中的等等聲明。它實際上並不是很多使用的'std ::'部件,但它們經常使用。 – eudoxos

回答

2

您需要爲您的共享指針類定義獨立函數'get_pointer'以使其與Boost Python一起使用。 (請注意,這使您可以編寫自己的共享指針,並且仍然可以使用Boost Python:這是一個有意識的設計,可以防止不同的Boost庫緊密耦合)

您可能會使用boost tr1兼容性標頭,但我沒有嘗試過。

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

當Boost.TR1配置爲使用你的標準庫的原生TR1實現的,那麼它不會做很多:它 只包括適當的頭。

當Boost.TR1使用特定組件的Boost實現時,它將包含適當的Boost頭,並使用聲明在命名空間std :: tr1中導入必要的聲明。請注意,只有那些標準的 部分的聲明被導入:爲了捕獲用戶代碼中的任何可移植性錯誤,實現故意非常嚴格地要求在名稱空間std :: tr1中不包含任何Boost特定的擴展。如果您確實需要使用Boost特定的擴展名,那麼您應該直接包含Boost標頭,並在名稱空間boost ::中使用聲明。請注意,這種實現方式 並不完全符合標準,特別是不可能將用戶定義的模板特化 TR1組件添加到名稱空間std :: tr1中。還有一個或兩個Boost庫尚未完全符合標準,因此任何此類不符合都按TR1按主題部分記錄。但有希望的是,在實踐中發生的非標準行爲應該是極其罕見的。

如果使用符合標準的頭包括(升壓/ TR1/TR1),那麼這些頭名有時也可以與現有的 標準庫頭文件(例如shared_ptr的被添加到現有的標準庫的頭,而不是它的 自己的衝突頭)。這些頭文件通過以下兩種方式之一轉發到現有標準庫頭文件:對於gcc,它使用#include_next, ,對於其他編譯器,它使用宏BOOST_TR1_STD_HEADER(頭文件)(在boost/tr1/detail/config.hpp中定義)評估 爲#include < ../ include/header>。對於大多數編譯器來說,這應該是「直接使用」的,但這確實意味着這些標頭不應該放在已經在編譯器搜索路徑中的名爲「include」的目錄中。

+0

謝謝!我認爲這將是更復雜的boost :: python。那麼,現在我使用boost :: serialization,並且它似乎沒有那麼靈活(例如[this thread](http://stackoverflow.com/questions/4094604/boost-serialization-serialize-stdtr1shared-ptr)建議複製和定製boost :: serialization爲boost :: shared_ptr執行的操作。 – eudoxos

相關問題