我收到错误reference_existing_object_requires_a_pointer_or_reference_return_type。
这是代码。
boost::shared_ptr<CDB::Basic> GetCdbWrapper(boost::shared_ptr<A> cmd)
{
return cmd->Cdb();
}
}
virtual boost::shared_ptr<CDB::Basic> Cdb() {
boost::shared_ptr<CDB::Basic> CdbObj;
return CdbObj;
}
boost::shared_ptr<CDB::Basic> GetCdb() {
return this->Cdb();
}
class_<A, bases<Core::CommandBase>, boost::shared_ptr<A>, boost::noncopyable, >("A",
":description:\n",
boost::python::no_init
)
.def("Cdb", &A::GetCdb,
":description:\n",
return_value_policy<reference_existing_object>()
);
我可能知道上面的代码有什么问题。我得到编译错误如下。
error C2027: use of undefined type 'boost::python::detail::reference_existing_object_requires_a_pointer_or_reference_return_type<R>'
1> with
1> [
1> R=result_t
1> ]
1> c:\boost\boost_1_47_0\boost\python\detail\caller.hpp(200) : while compiling class template member function 'PyObject *boost::python::detail::caller_arity<1>::impl<F,Policies,Sig>::operator ()(PyObject *,PyObject *)'
1> with
1> [
1> F=boost::shared_ptr<CDB::Basic> (__thiscall A::* )(void),
1> Policies=boost::python::return_value_policy<boost::python::reference_existing_object>,
1> Sig=boost::mpl::vector2<boost::shared_ptr<CDB::Basic>, A &>
1> ]
答案 0 :(得分:1)
如return_internal_reference
文档中所述,返回的对象通过指针或引用引用现有的内部对象:
return_internal_reference
[...]允许在没有复制指示物的情况下安全地返回内部保存的对象的指针和引用。
Boost.Python提供了一些概念检查,通常该类型强调失败的概念。在这种特殊情况下,编译器错误有:
reference_existing_object_requires_a_pointer_or_reference_return_type
这是因为GetCdb()
函数按值返回boost::shared_ptr<CDB::Basic>
,无法满足return_internal_reference
调用策略的要求。要解决此问题,请使用按值返回副本的默认调用策略。这要求CDB::Basic
通过Boost.Python公开,由boost::shared_ptr
持有。总的来说,这种行为与shared_ptr
经常使用的行为没有太大区别,其中一个人创建shared_ptr
的副本以维护共享所有权。
以下是一个示例demonstrating此行为:
#include <boost/python.hpp>
// Mocks...
class spam {};
boost::shared_ptr<spam> get_spam()
{
boost::shared_ptr<spam> spam_ptr(new spam());
return spam_ptr;
}
BOOST_PYTHON_MODULE(example)
{
namespace python = boost::python;
python::class_<spam, boost::shared_ptr<spam>, boost::noncopyable>(
"Spam", python::no_init);
python::def("get_spam", &get_spam);
}
交互式使用:
>>> import example
>>> spam = example.get_spam()
>>> assert(type(spam) is example.Spam)