我有一个大量使用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_ptr
(std::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_ptr
和std::shared_ptr
之间的歧义(除了现在不使用c ++ 0x),还有谢谢!
答案 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”的目录中。