[C++-sig] make_constructor + with_custodian_and_ward

Neal Becker ndbecker2 at gmail.com
Thu Jun 1 16:44:16 CEST 2006


Any ideas on this?  B will hold an 'A const&'.  I think I need
'with_custodian_and_ward' to ensure the 'A' object stays alive.  This code
won't compile:

#include <boost/python/module.hpp>
#include <boost/python/def.hpp>
#include <boost/python/class.hpp>
#include <boost/python/init.hpp>
#include <boost/python/make_constructor.hpp>
#include <boost/python/with_custodian_and_ward.hpp>
using namespace boost::python;

struct A {};
struct B {
  B (A const& _a) : a (_a) {}
  A const& a;
};

B* make_B (A const& a) {
  return new B (a);
}

BOOST_PYTHON_MODULE(test)
{
  class_<B> ("B", no_init)
    .def ("__init__", make_constructor (make_B,
                                        with_custodian_and_ward_postcall<0,1>(),
                                        (arg ("A"))));
}
[...]
/usr/local/src/boost.cvs/boost/python/with_custodian_and_ward.hpp:86: error:
invalid initialization of reference of type ‘PyObject* const&’ from
expression of type ‘const boost::python::detail::offset_args<PyObject*,
mpl_::int_<1> >’
/usr/local/src/boost.cvs/boost/python/detail/caller.hpp:50: error: in
passing argument 1 of ‘unsigned int boost::python::detail::arity(PyObject*
const&)’




More information about the Cplusplus-sig mailing list