[C++-sig] [Boost.Python] shared_ptr<const T>

Charles Flèche charlesf at the-mill.com
Mon Nov 20 12:26:28 CET 2006


> Ok for the workaround, but I'm going to give it a try !


I've tried it, but if now it compiles well, I have a python error at
runtime :

Traceback (most recent call last):
  File "<stdin>", line 1, in ?
Boost.Python.ArgumentError: Python argument types in
    Classd.f_const_shared_ptr(Classd, Classd)
did not match C++ signature:
    f_const_shared_ptr(Classd {lvalue}, boost::shared_ptr<Classd const>)


These are the files :

// Classd.h

#ifndef CLASSD_H
#define CLASSD_H

#include <string>

#include <boost/shared_ptr.hpp>
using namespace boost;

class Classd
{
    public:
        Classd();
        std::string type();
        shared_ptr<Classd> factory();
        shared_ptr<const Classd> factory_const();

        void f_object( Classd );
        void f_const_object( const Classd );
        void f_shared_ptr( shared_ptr<Classd> );
        void f_const_shared_ptr( shared_ptr<const Classd> );

    protected:
        void log( std::string );
       
};

#endif




// Classd.cpp

#include "Classd.h"

#include <iostream>
using namespace std;
using namespace boost;

Classd::Classd()
{
}

string Classd::type()
{
    return string( "I'm a Classd" );
}

shared_ptr<Classd> Classd::factory()
{
    shared_ptr<Classd> ret( new Classd );
    return ret;
}

shared_ptr<const Classd> Classd::factory_const()
{
    shared_ptr<Classd> ret( new Classd );
    return ret;
}

void Classd::f_object( Classd )
{
    log( "f_object" );
}

void Classd::f_const_object( const Classd )
{
    log( "f_const_object" );
}

void Classd::f_shared_ptr( shared_ptr<Classd> )
{
    log( "f_shared_ptr" );
}

void Classd::f_const_shared_ptr( shared_ptr<const Classd> )
{
    log( "f_const_shared_ptr" );
}

void Classd::log( string l )
{
    cout << "Classd : " << l << endl;
}

template class shared_ptr<Classd>;
template class shared_ptr<const Classd>;





// Wrap.cpp -- trimmed down version with just Classd

#include <boost/python.hpp>
using namespace boost::python;

#include "Classd.h"

namespace boost
{
    namespace python
    {
   
        template <class T> inline T* get_pointer(
boost::shared_ptr<const T> const& p)
        {
            return const_cast<T*>(p.get());
        }
       
        template <class T> struct pointee< boost::shared_ptr<const T> >
        {
            typedef T type;
        };
    }
}


BOOST_PYTHON_MODULE(OwnTest)
{
    class_< Classd >( "Classd" )
        .def( "type", &Classd::type )
        .def( "factory", &Classd::factory )
        .def( "factory_const", &Classd::factory_const )
        .def( "f_object", &Classd::f_object )
        .def( "f_const_object", &Classd::f_const_object )
        .def( "f_shared_ptr", &Classd::f_shared_ptr )
        .def( "f_const_shared_ptr", &Classd::f_const_shared_ptr )
    ;

    register_ptr_to_python< boost::shared_ptr<       Classd > >();
    register_ptr_to_python< boost::shared_ptr< const Classd > >();
   
}




// Python log

>>> a.factory()
<OwnTest.Classd object at 0xb7f20994>
>>> a.factory_const()
<OwnTest.Classd object at 0xb7f209cc>
>>> a.f_object( a )
Classd : f_object
>>> a.f_const_object( a )
Classd : f_const_object
>>> a.f_shared_ptr( a )
Classd : f_shared_ptr
>>> a.f_const_shared_ptr( a )
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
Boost.Python.ArgumentError: Python argument types in
    Classd.f_const_shared_ptr(Classd, Classd)
did not match C++ signature:
    f_const_shared_ptr(Classd {lvalue}, boost::shared_ptr<Classd const>)




-- 
Charles Fleche





More information about the Cplusplus-sig mailing list