I made some progress with the removing constness issue,
but now I'm having problems that seem to be related to
some kind of interaction between virtualness, function
transformation and return value policies.
The attached .hh and .pypp files illustrate the problem.
The transformation is applied correctly to a non-virtual
member function, but something goes wrong when the function
is virtual.
--
Pertti
class C {};
class A {
protected:
virtual ~A();
};
class B {
public:
virtual C *h(A const & x); // this does not work
//C *h(A const & x); // this works
//virtual C *h(); // and this
};
import pyplusplus
from pygccxml import declarations
from pyplusplus import function_transformers as FT
from pyplusplus.module_builder.call_policies import *
def remove_const_ref(type):
"""Converts "T const&" into "T &"
"""
if declarations.type_traits.is_reference(type):
t =
declarations.cpptypes.reference_t(declarations.type_traits.remove_const(type.base))
return t
return type
mb = pyplusplus.module_builder.module_builder_t(["virtual_const.hh"])
h = mb.mem_fun( 'h' )
h.add_transformation( FT.modify_type(0, remove_const_ref ) )
h.call_policies = return_internal_reference()
mb.build_code_creator( module_name="virtual_const" )
mb.write_module("virtual_const_bindings.cpp")
/usr/include/boost/python/detail/invoke.hpp: In function âPyObject*
boost::python::detail::invoke(boost::python::detail::invoke_tag_<false, false>,
const RC&, F&, AC0&, AC1&) [with RC =
boost::python::detail::caller_arity<2u>::impl<F, Policies,
Sig>::operator()(PyObject*, PyObject*) [with F = boost::python::api::object
(*)(B&, A&), Policies = boost::python::return_internal_reference<1u,
boost::python::default_call_policies>, Sig =
boost::mpl::vector3<boost::python::api::object, B&, A&>]::result_converter, F =
boost::python::api::object (*)(B&, A&), AC0 =
boost::python::detail::caller_arity<2u>::impl<F, Policies,
Sig>::operator()(PyObject*, PyObject*) [with F = boost::python::api::object
(*)(B&, A&), Policies = boost::python::return_internal_reference<1u,
boost::python::default_call_policies>, Sig =
boost::mpl::vector3<boost::python::api::object, B&, A&>]::c_t0, AC1 =
boost::python::detail::caller_arity<2u>::impl<F, Policies,
Sig>::operator()(PyObject*, PyObject*) [with F = boost::python::api::object
(*)(B&, A&), Policies = boost::python::return_internal_reference<1u,
boost::python::default_call_policies>, Sig =
boost::mpl::vector3<boost::python::api::object, B&, A&>]::c_t1]â:
/usr/include/boost/python/detail/caller.hpp:223: instantiated from
âPyObject* boost::python::detail::caller_arity<2u>::impl<F, Policies,
Sig>::operator()(PyObject*, PyObject*) [with F = boost::python::api::object
(*)(B&, A&), Policies = boost::python::return_internal_reference<1u,
boost::python::default_call_policies>, Sig =
boost::mpl::vector3<boost::python::api::object, B&, A&>]â
/usr/include/boost/python/object/py_function.hpp:38: instantiated from
âPyObject*
boost::python::objects::caller_py_function_impl<Caller>::operator()(PyObject*,
PyObject*) [with Caller =
boost::python::detail::caller<boost::python::api::object (*)(B&, A&),
boost::python::return_internal_reference<1u,
boost::python::default_call_policies>,
boost::mpl::vector3<boost::python::api::object, B&, A&> >]â
virtual_const_bindings.cpp:51: instantiated from here
/usr/include/boost/python/detail/invoke.hpp:75: virhe: no match for call to
â(const
boost::python::detail::reference_existing_object_requires_a_pointer_or_reference_return_type<boost::python::api::object>)
(boost::python::api::object)â
/usr/include/boost/python/detail/caller.hpp: In static member function
âstatic const PyTypeObject*
boost::python::detail::converter_target_type<ResultConverter>::get_pytype()
[with ResultConverter =
boost::python::detail::reference_existing_object_requires_a_pointer_or_reference_return_type<boost::python::api::object>]â:
/usr/include/boost/python/detail/caller.hpp:242: instantiated from âstatic
boost::python::detail::py_func_sig_info
boost::python::detail::caller_arity<2u>::impl<F, Policies, Sig>::signature()
[with F = boost::python::api::object (*)(B&, A&), Policies =
boost::python::return_internal_reference<1u,
boost::python::default_call_policies>, Sig =
boost::mpl::vector3<boost::python::api::object, B&, A&>]â
/usr/include/boost/python/object/py_function.hpp:48: instantiated from
âboost::python::detail::py_func_sig_info
boost::python::objects::caller_py_function_impl<Caller>::signature() const
[with Caller = boost::python::detail::caller<boost::python::api::object (*)(B&,
A&), boost::python::return_internal_reference<1u,
boost::python::default_call_policies>,
boost::mpl::vector3<boost::python::api::object, B&, A&> >]â
virtual_const_bindings.cpp:51: instantiated from here
/usr/include/boost/python/detail/caller.hpp:102: virhe: âstruct
boost::python::detail::caller_arity<2u>::impl<F, Policies,
Sig>::operator()(PyObject*, PyObject*) [with F = boost::python::api::object
(*)(B&, A&), Policies = boost::python::return_internal_reference<1u,
boost::python::default_call_policies>, Sig =
boost::mpl::vector3<boost::python::api::object, B&, A&>]::result_converterâ
has no member named âget_pytypeâ
_______________________________________________
Cplusplus-sig mailing list
[email protected]
http://mail.python.org/mailman/listinfo/cplusplus-sig