[C++-sig] boost python how to handle a type of shared_ptr<const T>

Dalton, Barnaby Barnaby.Dalton at brevanhoward.com
Mon Apr 3 19:15:07 CEST 2006


How do I use a shared_ptr<const T> type in boost python? I have the
following test code:

#include <vector>
#include <boost/shared_ptr.hpp>

using namespace std;
using namespace boost;

// vector
vector<int> listTest1()
{
  vector<int> a;
  a.push_back(5); a.push_back(10);
  return a;
}

// shared pointer to vector
shared_ptr<vector<int> > listTest2()
{
  shared_ptr<vector<int> > a(new vector<int>());
  a->push_back(6); a->push_back(11);
  return a;
}

// const vector
const vector<int> listTest3()
{
  vector<int> a;
  a.push_back(7); a.push_back(12);
  return a;
}

// shared pointer to const vector
shared_ptr<const vector<int> > listTest4()
{
  shared_ptr<vector<int> > a(new vector<int>());
  a->push_back(8); a->push_back(13);
  return a;
}

#include <boost/python/module.hpp>
#include <boost/python/def.hpp>
#include <boost/python/iterator.hpp>
#include <boost/python/register_ptr_to_python.hpp>

using namespace boost::python;

BOOST_PYTHON_MODULE(hello)
{
  class_<vector<int> >("vec_int")
    .def("push_back", &vector<int>::push_back)
    .def("__iter__", iterator<vector<int> >())
        ;

    def("listTest1", listTest1);
    def("listTest2", listTest2);
    def("listTest3", listTest3);
    def("listTest4", listTest4);

    register_ptr_to_python< boost::shared_ptr<vector <int> > >();
    //register_ptr_to_python< boost::shared_ptr<const vector <int> >
>();
}


listTest 1->3 work fine. If I try and call listTest4 from python I get:

Traceback (most recent call last):
  File "test.py", line 19, in ?
    a = [x for x in hello.listTest4()]
TypeError: No to_python (by-value) converter found for C++ type: class
boost::shared_ptr<class std::vector<int,class std::allocator<int> >
const >

If I uncomment 'register_ptr_to_python< boost::shared_ptr<const vector
<int> > >();' then I get compile errors:

C:\Source\boost_1_33_1\boost\python\object\pointer_holder.hpp(138) :
error C2664: 'boost::python::objects::find_dynamic_type' : cannot
convert parameter 1 from 'const X *' to 'void *'
        Conversion loses qualifiers
        C:\Program Files\Microsoft Visual Studio .NET
2003\Vc7\include\vector(152) : while compiling class-template member
function 'void
*boost::python::objects::pointer_holder<Pointer,Value>::holds(boost::pyt
hon::type_info,bool)'
        with
        [
            Pointer=boost::shared_ptr<const std::vector<int>>,
            Value=const X
        ]
etc....

I'm new to boost python so please feel free to point to any
documentation/examples I might have missed.

Thanks
Barney








More information about the Cplusplus-sig mailing list