我有一个c++代码,它大量使用shared_ptr和STL。一个常见的标题是
#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)的模糊性。
当切换到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>&)'因此,我的问题是
如果有一个简单的解决方案来解决automatically.和std::shared_ptr之间的歧义(除了暂时不使用c++0x ),还有
boost::shared_ptr最终只是std::shared_ptr的别名),这将解决我的问题--c++0x谢谢!
发布于 2011-07-04 08:27:00
您需要为共享指针类定义独立的函数'get_pointer‘,这样它才能使用Boost Python。(请注意,这使您能够编写自己的共享指针,并且仍然可以使用Boost Python:这是一种有意识的设计工作,以防止不同的Boost库之间的紧密耦合)。
您可以使用boost tr1兼容性头来实现这一点,但我还没有尝试过。
http://boost.cowic.de/rc/pdf/tr1.pdf
当
配置为使用标准库的本机TR1实现时,它不会做太多事情:它只包含适当的标头。
当Boost.TR1使用特定组件的Boost实现时,它将包含适当的Boost报头,并使用声明在命名空间std::tr1中导入必要的声明。请注意,只有标准的一部分声明是导入的:为了捕捉用户代码中的任何可移植性错误,实现故意非常严格地不在命名空间std::tr1中包含任何特定于Boost的扩展。如果您确实需要使用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 <../include/ header >。对于大多数编译器来说,这应该是“直截了当的”,但这确实意味着这些标题永远不应该放在一个名为"include“的目录中,该目录已经在编译器的搜索路径中。
https://stackoverflow.com/questions/6568952
复制相似问题