[C++-sig] boost.python: private copy constructor problem

Renato Araujo renatox at gmail.com
Tue Dec 2 15:11:09 CET 2008


try use boost::noncopyable to B or implemente a copy constructor in B
without call A copy contructor.

BR



On Tue, Dec 2, 2008 at 11:03 AM, Mihail Konstantinov
<kmihail at rocketmail.com> wrote:
>> Stefan Seefeld wrote:
>
>>
>> In this case you want to tell Python that your object is non-copyable:
>
> I followed your suggestion and still get the same error message:
> boost.cpp:6: error: 'A::A(const A&)' is private
> (full bjam output is appended to this email)
>
> Could you check this modified code? boost_ext.cpp:
> #include <boost/python.hpp>
> using namespace boost::python;
>
> class A{
> private:
>  A(const A&){}; //no public copy constructor
> public:
>  A(){};
> };
>
> class B: public A{
> public:
>  B(){};
> };
>
> BOOST_PYTHON_MODULE(boost_ext)
> {
>    class_<A,boost::noncopyable> a("A",init<>());
>    class_<B, bases<A> >("B",init<>());
> }
>
> Thank you
> Mihail
>
> Compilation output:
>
> $bjam boost_ext
> ...patience...
> ...found 1202 targets...
> ...updating 2 targets...
> gcc.compile.c++ bin/gcc-4.1.2/debug/boost.o
> boost.cpp: In copy constructor 'B::B(const B&)':
> boost.cpp:11:   instantiated from 'boost::python::objects::value_holder<Value>::value_holder(PyObject*, A0) [with A0 = boost::reference_wrapper<const B>, Value = B]'
> /home/mihail/temporary/boost_1_37_0/boost/python/object/make_instance.hpp:68:   instantiated from 'static Holder* boost::python::objects::make_instance<T, Holder>::construct(void*, PyObject*, boost::reference_wrapper<const T>) [with T = B, Holder = boost::python::objects::value_holder<B>]'
> /home/mihail/temporary/boost_1_37_0/boost/python/object/make_instance.hpp:42:   instantiated from 'static PyObject* boost::python::objects::make_instance_impl<T, Holder, Derived>::execute(Arg&) [with Arg = const boost::reference_wrapper<const B>, T = B, Holder = boost::python::objects::value_holder<B>, Derived = boost::python::objects::make_instance<B, boost::python::objects::value_holder<B> >]'
> /home/mihail/temporary/boost_1_37_0/boost/python/object/class_wrapper.hpp:29:   instantiated from 'static PyObject* boost::python::objects::class_cref_wrapper<Src, MakeInstance>::convert(const Src&) [with Src = B, MakeInstance = boost::python::objects::make_instance<B, boost::python::objects::value_holder<B> >]'
> /home/mihail/temporary/boost_1_37_0/boost/python/converter/as_to_python_function.hpp:27:   instantiated from 'static PyObject* boost::python::converter::as_to_python_function<T, ToPython>::convert(const void*) [with T = B, ToPython = boost::python::objects::class_cref_wrapper<B, boost::python::objects::make_instance<B, boost::python::objects::value_holder<B> > >]'
> /home/mihail/temporary/boost_1_37_0/boost/python/to_python_converter.hpp:87:   instantiated from 'boost::python::to_python_converter<T, Conversion, has_get_pytype>::to_python_converter() [with T = B, Conversion = boost::python::objects::class_cref_wrapper<B, boost::python::objects::make_instance<B, boost::python::objects::value_holder<B> > >, bool has_get_pytype = true]'
> /home/mihail/temporary/boost_1_37_0/boost/python/object/class_wrapper.hpp:26:   instantiated from 'static void boost::python::objects::class_metadata<T, X1, X2, X3>::maybe_register_class_to_python(T2*, mpl_::false_) [with T2 = B, T = B, X1 = boost::python::bases<A, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_>, X2 = boost::python::detail::not_specified, X3 = boost::python::detail::not_specified]'
> /home/mihail/temporary/boost_1_37_0/boost/python/object/class_metadata.hpp:229:   instantiated from 'static void boost::python::objects::class_metadata<T, X1, X2, X3>::register_aux2(T2*, Callback) [with T2 = B, Callback = boost::integral_constant<bool, false>, T = B, X1 = boost::python::bases<A, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_>, X2 = boost::python::detail::not_specified, X3 = boost::python::detail::not_specified]'
> /home/mihail/temporary/boost_1_37_0/boost/python/object/class_metadata.hpp:219:   instantiated from 'static void boost::python::objects::class_metadata<T, X1, X2, X3>::register_aux(void*) [with T = B, X1 = boost::python::bases<A, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_>, X2 = boost::python::detail::not_specified, X3 = boost::python::detail::not_specified]'
> /home/mihail/temporary/boost_1_37_0/boost/python/object/class_metadata.hpp:205:   instantiated from 'static void boost::python::objects::class_metadata<T, X1, X2, X3>::register_() [with T = B, X1 = boost::python::bases<A, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_>, X2 = boost::python::detail::not_specified, X3 = boost::python::detail::not_specified]'
> /home/mihail/temporary/boost_1_37_0/boost/python/class.hpp:496:   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 = B, X1 = boost::python::bases<A, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_>, X2 = boost::python::detail::not_specified, X3 = boost::python::detail::not_specified]'
> /home/mihail/temporary/boost_1_37_0/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 = B, X1 = boost::python::bases<A, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_, mpl_::void_>, X2 = boost::python::detail::not_specified, X3 = boost::python::detail::not_specified]'
> boost.cpp:19:   instantiated from here
> boost.cpp:6: error: 'A::A(const A&)' is private
> boost.cpp:11: error: within this context
> /home/mihail/temporary/boost_1_37_0/boost/python/object/value_holder.hpp: In constructor 'boost::python::objects::value_holder<Value>::value_holder(PyObject*, A0) [with A0 = boost::reference_wrapper<const B>, Value = B]':
> /home/mihail/temporary/boost_1_37_0/boost/python/object/value_holder.hpp:134: note: synthesized method 'B::B(const B&)' first required here
>
>    "g++"  -ftemplate-depth-128 -O0 -fno-inline -Wall -g -fPIC    -I"/home/mihail/temporary/boost_1_37_0" -I"/usr/include/python2.5" -c -o "bin/gcc-4.1.2/debug/boost.o" "boost.cpp"
>
> ...failed gcc.compile.c++ bin/gcc-4.1.2/debug/boost.o....
> ...skipped <pbin/gcc-4.1.2/debug>boost_ext.so for lack of <pbin/gcc-4.1..2/debug>boost.o...
> ...failed updating 1 target...
> ...skipped 1 target....
>
>
>
>
>
> _______________________________________________
> Cplusplus-sig mailing list
> Cplusplus-sig at python.org
> http://mail.python.org/mailman/listinfo/cplusplus-sig



-- 
Renato Araujo Oliveira Filho


More information about the Cplusplus-sig mailing list