|
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