Hi!
I've been using the boost::python library for some time with few problems
but now I got stuck.
Fortunately I isolated the problem.
In the class Domain below I defined a property called solver which returns
a shared_ptr<Solver> instance:
*namespace bp=boost::python;**
**class Solver
**{
**public:
** bool _b;
** void func() { _b = true; }
**};**
**typedef shared_ptr<Solver> Solver_ptr;**
**
class Domain
**{
**public:
** Solver_ptr solver;
** void set_solver(Solver_ptr s) { solver = s; }
**};**
**typedef shared_ptr<Domain> Domain_ptr;**
**
BOOST_PYTHON_MODULE(test) {**
*
* bp::class_("Solver")*
* .def("func", &Solver::func)*
* ;*
* bp::class_("Domain")*
* .def("set_solver" , &Domain::set_solver)*
* .add_property("solver" , &Domain::solver)*
* ;*
*}*
The code compiles ok. The problem appears while running in Python:
*from test import *
**d = Domain()
**s = Solver()
**d.set_solver(s) # is it ok to do that?
**d.solver.func() # this line does not work*
With the following error message:
*Traceback (most recent call last):*
* File "test_test.py", line 5, in <module>*
* d.solver.func()*
*Boost.Python.ArgumentError: Python argument types in*
* Solver.func(Solver)*
*did not match C++ signature:*
* func(Solver {lvalue})*
I suspect that the problem is related with add_property returning a
shared_ptr<Solver> aka Solver_ptr.
It seems that add_property is returning a *non lvalue* Solver object.
I tried applying return value policies with no luck.
How can I get Domain::solver with type Solver_ptr in Python as a lvalue ?
Thanks!
Raul Durand