coup de pouce.python: types d'Argument ne correspond pas à C++ signature
J'ai un étrange problème lors de l'appel d'une fonction C++, python.
J'ai exposé une classe à partir de laquelle je veux appeler une fonction:
class_<MyClass, std::shared_ptr<MyClass>>("MyClass", init<>())
//...
.def("someFunc", &MyClass::someFunc)
;
- Je obtenir un std::shared_ptr<MyClass>
à partir d'une variable membre d'une autre classe qui est exposée via .def_readonly(...)
Quand j'essaie d'appeler la fonction, j'obtiens l'erreur suivante:
File "pytest.py", line 27, in test_func
cu.someFunc("string")
Boost.Python.ArgumentError: Python argument types in
MyClass.someFunc(MyClass, str)
did not match C++ signature:
result(MyClass{lvalue}, std::string)
Autant que je le vois, les signatures ne match.
Quelqu'un voit le problème?
OriginalL'auteur mario.schlipf | 2013-12-29
Vous devez vous connecter pour publier un commentaire.
Recensés dans cette billet, coup de pouce.Python n'est pas entièrement en charge
std::shared_ptr
.En bref, deux solutions simples sont:
boost::shared_ptr
au lieu destd::shared_ptr
.std::shared_ptr
variable de membre viaadd_property()
, en fournissant unboost::python::return_value_policy
avec un type deboost::python::return_by_value
.Tandis que les signatures de l'exception la même apparence, le subtil détail, c'est que le Python
MyClass
objet incorpore unstd::shared_ptr<MyClass>
. Donc, Coup De Pouce.Python doit effectuer une conversion à partir d'unestd::shared_ptr<MyClass>
à une lvalueMyClass
. Cependant, Coup De Pouce.Python n'est pas actuellement en charge personnalisé lvalue conversions. Ainsi, unArgumentError
exception est levée.En exposant variables de membre avec
def_readonly("spam", &Factory::spam)
, c'est l'équivalent de l'exposer via:Coup de pouce.Python a un code spécial lorsque le type d'être exposée de cette manière est une
boost::shared_ptr
. Comme c'est une propriété en lecture seule etstd::shared_ptr
est destiné à être copié, il est sûr d'exposer une copie destd::shared_ptr
avec une valeur de retour de la politique avec un type dereturn_by_value
.Voici un exemple complet d'où
Factory
expose unSpam
objet tenu parstd::shared_ptr
et unEgg
objet tenu parboost::shared_ptr
:Interactive Python démonstration de l'utilisation et de la durée de vie des objets:
OriginalL'auteur Tanner Sansbury
Ne l'ai pas testé, mais cela peut fonctionner:
Source:
http://www.boost.org/doc/libs/1_55_0/libs/python/doc/v2/register_ptr_to_python.html
OriginalL'auteur cdyson37