2017-01-27 2 views
0

J'essaye d'encapsuler une classe C++ qui gère les valeurs binaires en utilisant Boost.Python. Pour cette classe, le "< <" opérateur a été défini commeBoost.Python: Impossible d'encapsuler C++ "operator <<" pour exposer la fonctionnalité d'impression en Python

std::ostream &operator<<(std::ostream &output, const bin &inbin); 

Je l'ai essayé emballage avec

class_<bin>("bin", init<>()) 
    .def(str(self)); 

Cependant, la compilation jette cette erreur:

boost/python/def_visitor.hpp:31:9: error: no matching function for call to 
‘boost::python::api::object::visit(boost::python::class_<itpp::bin>&) const’ 

Je suis pas sûr de savoir comment résoudre cette erreur, quelqu'un a une idée?

Référence: http://www.boost.org/doc/libs/1_31_0/libs/python/doc/tutorial/doc/class_operators_special_functions.html

+1

Pourquoi ce SWIG marqué et ctypes quand il s'agit de boost.python? – Flexo

+0

@flexo Le problème pourrait être quelque chose de fondamental lié à l'opérateur d'emballage << pour python – vid

+2

Si vous écrivez une interface boost.python, cela n'a rien à voir avec un swig one ou un ctypes. – Flexo

Répondre

1

Cela semble en quelque sorte à couvrir dans les domaines suivants SO messages:
what is wrong with c++ streams when using boost.python?
Build problems when adding `__str__` method to Boost Python C++ class

Ainsi, selon les messages précédents, vous devriez essayer de remplacer

.def(str(self)); 

avec soit

.def(self_ns::str(self)); 

ou

.def(self_ns::str(self_ns::self)) 

Il semble avoir résolu le même problème dans ces cas.

Si ce qui précède ne fonctionne pas, essayez d'écrire un wrapper personnalisé. Par exemple, vous pouvez définir une fonction print_wrap comme:

#include <sstream> 
std::string print_wrap(const classname &c) 
{ 
    std::ostringstream oss; 
    oss << "HelloWorld " << c.var1 << " " << c.var2; 
    return oss.str(); 
} 

Et puis dans l'utilisation class_<classname>("py_classname") définition,

.def("__str__", &print_wrap) 

Puis en Python, vous devriez être en mesure d'obtenir

>>> obj = py_classname(1,2) #var1=1, var2=2 
>>> print obj 
>>> HelloWorld 1 2