[C++-sig] Wrapping a class with private operator&()
Matthias Baas
baas at ira.uka.de
Fri Oct 7 15:12:41 CEST 2005
Hi,
I'm having problems wrapping a C++ class that has a private reference
operator (operator&()). Here is a minimal example that shows the problem:
#include <boost/python.hpp>
using namespace boost::python;
class Spam
{
public:
Spam() {}
private:
Spam* operator&() {return this;}
};
BOOST_PYTHON_MODULE(mod)
{
class_<Spam, boost::noncopyable>("Spam", init<>());
}
When I compile this code (either using gcc 3.3.4 on Linux or MSVC 7.1 on
WinXP, both with Python 2.4 and boost-1.33.0) I get an error like that
attached at the end of this mail. I suppose the relevant part of the
message is this:
/client/include/boost/python/detail/def_helper.hpp:79: instantiated
from here
mod.cpp:13: error: `Spam* Spam::operator&()' is private
I can compile the code if I specify the class with no_init, but then the
wrapper would be useless as it must be possible to create instances of
the class. It would be acceptable to have a factory function that
actually creates the instances but when I tried that it also didn't compile.
So does anybody know how to wrap a class like the above?
- Matthias -
Error message from gcc:
gcc -pthread -fno-strict-aliasing -DNDEBUG -g -O3 -Wall
-Wstrict-prototypes -fPIC -I/client/include
-I/sw/i386_linux-2.0_glibc2/Python-2.4.1/include/python2.4 -c mod.cpp -o
build/temp.linux-i686-2.4/mod.o
mod.cpp: In constructor `
boost::python::objects::value_holder<Value>::value_holder(PyObject*)
[with
Value = Spam]':
/client/include/boost/python/object/make_holder.hpp:83: instantiated
from `static void boost::python::objects::make_holder<0>::apply<Holder,
ArgList>::execute(PyObject*) [with Holder =
boost::python::objects::value_holder<Spam>, ArgList =
boost::mpl::vector0<mpl_::na>]'
/client/include/boost/python/detail/make_keyword_range_fn.hpp:60:
instantiated from `boost::python::api::object
boost::python::detail::make_keyword_range_constructor(const
CallPolicies&, const boost::python::detail::keyword_range&, Holder*,
ArgList*, Arity*) [with ArgList = boost::mpl::vector0<mpl_::na>, Arity =
boost::mpl::size<boost::mpl::vector0<mpl_::na> >, Holder =
boost::python::objects::value_holder<Spam>, CallPolicies =
boost::python::default_call_policies]'
/client/include/boost/python/init.hpp:330: instantiated from `void
boost::python::detail::def_init_aux(ClassT&, const Signature&, NArgs,
const CallPoliciesT&, const char*, const
boost::python::detail::keyword_range&) [with ClassT =
boost::python::class_<Spam, boost::noncopyable,
boost::python::detail::not_specified,
boost::python::detail::not_specified>, CallPoliciesT =
boost::python::default_call_policies, Signature =
boost::mpl::vector0<mpl_::na>, NArgs =
boost::mpl::size<boost::mpl::vector0<mpl_::na> >]'
/client/include/boost/python/init.hpp:399: instantiated from `static
void boost::python::detail::define_class_init_helper<0>::apply(ClassT&,
const CallPoliciesT&, const Signature&, NArgs, const char*, const
boost::python::detail::keyword_range&) [with ClassT =
boost::python::class_<Spam, boost::noncopyable,
boost::python::detail::not_specified,
boost::python::detail::not_specified>, CallPoliciesT =
boost::python::default_call_policies, Signature =
boost::mpl::vector0<mpl_::na>, NArgs =
boost::mpl::size<boost::mpl::vector0<mpl_::na> >]'
/client/include/boost/python/init.hpp:171: instantiated from `void
boost::python::init_base<DerivedT>::visit(classT&) const [with classT =
boost::python::class_<Spam, boost::noncopyable,
boost::python::detail::not_specified,
boost::python::detail::not_specified>, DerivedT =
boost::python::init<mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_,
mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_,
mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_,
mpl_::void_>]'
/client/include/boost/python/def_visitor.hpp:31: instantiated from
`static void boost::python::def_visitor_access::visit(const V&, classT&)
[with V = boost::python::def_visitor<boost::python::init<mpl_::void_,
mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_,
mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_,
mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_> >, classT =
boost::python::class_<Spam, boost::noncopyable,
boost::python::detail::not_specified,
boost::python::detail::not_specified>]'
/client/include/boost/python/def_visitor.hpp:67: instantiated from
`void boost::python::def_visitor<DerivedVisitor>::visit(classT&) const
[with classT = boost::python::class_<Spam, boost::noncopyable,
boost::python::detail::not_specified,
boost::python::detail::not_specified>, DerivedVisitor =
boost::python::init<mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_,
mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_,
mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_,
mpl_::void_>]'
/client/include/boost/python/class.hpp:225: instantiated from
`boost::python::class_<T, X1, X2, X3>& boost::python::class_<T, X1, X2,
X3>::def(const boost::python::def_visitor<Derived>&) [with Derived =
boost::python::init<mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_,
mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_,
mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_,
mpl_::void_>, W = Spam, X1 = boost::noncopyable, X2 =
boost::python::detail::not_specified, X3 =
boost::python::detail::not_specified]'
/client/include/boost/python/class.hpp:501: instantiated from `void
boost::python::class_<T, X1, X2, X3>::initialize(const DefVisitor&)
[with DefVisitor =
boost::python::init_base<boost::python::init<mpl_::void_, mpl_::void_,
mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_,
mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_,
mpl_::void_, mpl_::void_, mpl_::void_> >, W = Spam, X1 =
boost::noncopyable, X2 = boost::python::detail::not_specified, X3 =
boost::python::detail::not_specified]'
/client/include/boost/python/class.hpp:208: instantiated from
`boost::python::class_<T, X1, X2, X3>::class_(const char*, const
boost::python::init_base<DerivedT>&) [with DerivedT =
boost::python::init<mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_,
mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_,
mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_,
mpl_::void_>, W = Spam, X1 = boost::noncopyable, X2 =
boost::python::detail::not_specified, X3 =
boost::python::detail::not_specified]'
mod.cpp:19: instantiated from here
mod.cpp:13: error: `Spam* Spam::operator&()' is private
/client/include/boost/python/object/value_holder.hpp:134: error: within
this
context
mod.cpp: In member function `void*
boost::python::objects::value_holder<Value>::holds(boost::python::type_info,
bool) [with Value = Spam]':
/client/include/boost/python/detail/def_helper.hpp:79: instantiated
from here
mod.cpp:13: error: `Spam* Spam::operator&()' is private
/client/include/boost/python/object/value_holder.hpp:89: error: within this
context
mod.cpp:13: error: `Spam* Spam::operator&()' is private
/client/include/boost/python/object/value_holder.hpp:89: error: within this
context
/client/include/boost/python/detail/def_helper.hpp:79: instantiated
from here
mod.cpp:13: error: `Spam* Spam::operator&()' is private
/client/include/boost/python/object/value_holder.hpp:93: error: within this
context
mod.cpp:13: error: `Spam* Spam::operator&()' is private
/client/include/boost/python/object/value_holder.hpp:93: error: within this
context
More information about the Cplusplus-sig
mailing list