[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