c ++ 0x std :: shared_ptr vs. boost :: shared_ptr

时间:2011-07-04 08:18:41

标签: python c++11 boost shared-ptr python-c-api

我有一个大量使用shared_ptr和STL的c ++代码。一个常见的标题是

#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_ptr,导致未指定的boost::shared_ptrstd::shared_ptr vs std::shared_ptr)模糊不清。

切换到#include<memory> using namespace std; // for STL; also imports std::shared_ptr 时,改为:

boost::python

然后我遇到boost::shared_ptr的问题,/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>&)' 仅适用于boost::shared_ptr(至少没有进一步摆弄):

std::shared_ptr

因此我的问题是

  • 如果有一个简单的解决方案来解决boost::shared_ptrstd::shared_ptr之间的歧义(除了现在不使用c ++ 0x),还有
  • 如果{{1}}最终只是{{1}}的别名;这将自动解决我的问题。

谢谢!

1 个答案:

答案 0 :(得分: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头和   使用声明在namespace std :: tr1中导入必要的声明。请注意,只有那些声明属于一部分   标准的导入:对于不包括任何特定于Boost的扩展,实现是非常严格的   namespace std :: tr1,用于捕获用户代码中的任何可移植性错误。如果你真的需要使用特定于Boost的扩展   你应该直接包含Boost头文件并使用命名空间boost ::中的声明。注意这种实现方式   不完全符合标准,特别是不可能添加用户定义的模板特化   TR1组件进入命名空间std :: tr1。还有一个或两个Boost库尚未完全符合标准,   TR1中按主题部分记录了任何此类不合格情况。希望发生非标准行为   然而,在实践中极为罕见。

     

如果使用标准符合标头包含(在boost / tr1 / tr1中),那么这些标题名称有时可能与现有标题冲突   标准库头(例如shared_ptr被添加到现有标准库头而不是它   自己的头)。这些标题以两种方式之一转发到您现有的标准库标题:对于gcc,它使用#include_next,   对于其他编译器,它使用宏BOOST_TR1_STD_HEADER(标题)(在boost / tr1 / detail / config.hpp中定义)进行评估   到#include&lt; ../ include / header&gt;。对于大多数编译器来说,这应该“直接开箱”,但确实意味着这些   标题不应该放在编译器搜索路径中已经存在的名为“include”的目录中。