Boost logo

Boost Users :

Subject: [Boost-users] [Pyhton] boost::shared_ptr problem between python modules
From: Tamas.Ruszkai_at_[hidden]
Date: 2015-06-17 05:32:04


Hi All,

I use
- Visual Studio 2013
- boost 1.58 with NuGet
- 64 bit Intel

I have a class (called Log::FileSink) that I want to instantiate via a
boost::shared_ptr. This class is derived from an abstract interface
(Log::ISink) which is wrapped (Log::ISinkRealizer)

        boost::python::class_<Log::ISinkRealizer, boost::shared_ptr<Log::
ISinkRealizer>, boost::noncopyable>("ISink", boost::python::no_init)
                .def("AddEntry", boost::python::pure_virtual(&Log::
ISinkRealizer::AddEntry))
                .def("ShallLog", boost::python::pure_virtual(&Log::
ISinkRealizer::ShallLog));

        boost::python::class_<Log::FileSink, boost::shared_ptr<Log::
FileSink>, boost::python::bases<Log::ISink>, boost::noncopyable>
                ("FileSink", boost::python::init<const std::string&>())
                .def("AddDomain", &Log::FileSink::AddDomain):

When I create a python instance from the FileSink and I pass it to the
constructor of another class inside the same module then it works fine.

>>> import DiagnsoticsPy
>>> logFile = DiagnsoticsPy.FileSink("system.log");
>>> logFile.AddDomain("Sensor.SensorController",
DiagnsoticsPy.Severity.VerboseAndAbove);
>>> logFile.AddDomain("Python.DI",
DiagnsoticsPy.Severity.VerboseAndAbove);
>>> logSource = DiagnsoticsPy.Source("Python.DI", logFile)

        boost::python::class_<Log::Source, boost::shared_ptr<Log::Source
>>("Source", boost::python::init<const std::string&>())
                .def(boost::python::init<const std::string&, boost::
shared_ptr<Log::ISink>>());

        class DIAGNOSTICS_API Source
        {
        public:
                Source(const std::string& name, boost::shared_ptr<Log::
ISink> sink);

        };

However when I want to pass the same "logFile" instance to a method which
is defined in another python module then the conversion between python and
C++ fails.

        boost::python::class_<Sensor::SensorController, boost::shared_ptr
<Sensor::SensorController>, boost::noncopyable>("SensorController",
                boost::python::init<boost::shared_ptr<Log::ISink>>());

        class SENSORCONTROL_API SensorController : public boost::
enable_shared_from_this<SensorController>
        {
        public:
                explicit SensorController(boost::shared_ptr<Log::ISink>
logSink);
        };

>>> import SensorControlPy
>>> sensorController = SensorControlPy.SensorController(logFile);

Python argument types in
    SensorController.__init__(SensorController, FileSink)
did not match C++ signature:
    __init__(struct _object * __ptr64, class boost::shared_ptr<class
Log::ISink>)

If I put the all the Python bindings (also the SensorController) into the
same python module then the call to the SensorController constructor
works.



Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net