我有一个大量使用的 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
vs 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>&)'
因此我的问题是
- 如果有一个简单的解决方案来解决之间的歧义
boost::shared_ptr
and std::shared_ptr
(除了现在不使用 c++0x 之外),并且
- if
boost::shared_ptr
最终将只是一个别名std::shared_ptr
;这会自动解决我的问题。
Thanks!
您需要为共享指针类定义独立函数“get_pointer”,才能与 Boost Python 一起使用。(请注意,这使您能够编写自己的共享指针,并且仍然可以使用 Boost Python:这是一个有意识的设计工作,旨在防止不同 Boost 库的紧密耦合).
您可能会使用 boost tr1 兼容性标头来实现这一点,但我还没有尝试过。
http://boost.cowic.de/rc/pdf/tr1.pdf http://boost.cowic.de/rc/pdf/tr1.pdf
当 Boost.TR1 配置为使用标准库的本机 TR1 实现时,它不会做太多事情:
仅包含适当的标头。
当 Boost.TR1 使用特定组件的 Boost 实现时,它包含适当的 Boost 标头和
使用 using 声明在命名空间 std::tr1 中导入必要的声明。请注意,只有那些属于
标准的一部分被导入:实现是故意非常严格的,不包括任何特定于 Boost 的扩展
命名空间 std::tr1,以便捕获用户代码中的任何可移植性错误。如果您确实需要使用 Boost 特定的扩展,那么
您应该直接包含 Boost 标头并使用命名空间 boost:: 中的声明。请注意,这种实现方式
不完全符合标准,特别是无法添加用户定义的模板专业化
TR1 组件放入命名空间 std::tr1 中。还有一两个 Boost 库尚未完全符合标准,
任何此类不符合项均记录在 TR1 按主题部分中。希望非标准行为的发生应该
然而在实践中极为罕见。
如果您使用标准的符合标头包含(在 boost/tr1/tr1 中),那么这些标头名称有时可能会与现有的冲突
标准库头(例如shared_ptr被添加到现有的标准库头而不是它的
自己的标题)。这些标头通过以下两种方式之一转发到您现有的标准库标头:对于 gcc,它使用 #include_next,
对于其他编译器,它使用宏 BOOST_TR1_STD_HEADER(header) (在 boost/tr1/detail/config.hpp 中定义)来评估
到 #include <..>。对于大多数编译器来说,这应该“直接开箱即用”,但这确实意味着这些
标头不应放置在编译器搜索路径中已存在的名为“include”的目录中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)