2011-07-04 187 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

相关问题