2010-12-06 12 views
14

Actualización 2: No estoy seguro de por qué esto todavía se está votando (marzo de 2014). Esto parece ser fijo ya que hice esta pregunta hace muchos años. Asegúrate de estar usando una versión reciente de boost.¿Qué hay de malo en las transmisiones de C++ cuando se utiliza boost.python?

ACTUALIZACIÓN: ¿Quizás las secuencias de C++ deben inicializarse para formatear números, y la inicialización no ocurre cuando la biblioteca compartida se carga en Python?

Estoy llamando

cout << 1 << "!" << endl; 

en un método que se exporta a través de una biblioteca compartida Boost.Python. No imprime nada, pero si lo hago

cout << "%" << "!" << endl; 

funciona.

Esto es importante porque quiero hacer esto:

ostream& operator <<(ostream &os, const Bernoulli& b) { 
    ostringstream oss; 
    oss << b.p() * 100.0 << "%"; 
    return os << oss.str(); 
} 

expuse que al hacer esto:

BOOST_PYTHON_MODULE(libdistributions) 
{ 
    class_<Bernoulli>("Bernoulli") 
     .def(init<>()) 
     .def(init<double>()) 

     .def("p", &Bernoulli::p) 
     .def("set_p", &Bernoulli::set_p) 
     .def("not_p", &Bernoulli::not_p) 

     .def("Entropy", &Bernoulli::Entropy) 
     .def("KL", &Bernoulli::KL) 
     .def(self_ns::str(self)) 
    ; 
} 

pero cuando llamo el método str en pitón en un objeto de Bernoulli, que no obtener nada Sospecho que el problema de cout más simple está relacionado.

+0

No he tenido un problema con iostreams y Boost.Python ... tal vez el problema proviene de un error más sutil? Sin embargo, la técnica en los documentos (http://1dl.us/dAD) no funcionó para mí, tuve que escribir '.def (" __ str__ ", & print_wrapper )'. ¿Qué es 'self_ns' ?. Además, en su método, ¿por qué no simplemente '{return os << b.p() * 100.0 <<"% "; } '? – rafak

+0

@rafak la razón para hacerlo a través de ostringstream se explica en esta pregunta: http://stackoverflow.com/questions/2249018/using-setw-with-user-defined-ostream-operators –

+0

@rafak donde se define 'print_wrapper' ? No puedo encontrarlo en el impulso. –

Respuesta

1

también me encuentro con este problema hace un tiempo, usando self_ns como se indica en las respuestas aquí Build problems when adding `__str__` method to Boost Python C++ class

La razón para usar self_ns se explica por sí mismo aquí a Dave http://mail.python.org/pipermail/cplusplus-sig/2004-February/006496.html


Justo por el bien de la depuración, intente

inline std::string toString(const Bernoulli& b) 
{ 
    std::ostringstream s; 
    s << b; 
    return s.str(); 
} 

y reemplazar .def(self_ns::str(self)) con

class_<Bernoulli>("Bernoulli") 
[...] 
.def("__str__", &toString) 
+0

Utilicé self_ns como se muestra en la pregunta, y no solucionó este problema. –

+0

¿Puedes probar '.def (self_ns :: str (self_ns :: self))'? –

+0

También podría intentar agregar 'std :: cout <<" hello world << std :: endl "dentro de su operador << e informar si se llama a su función. –

1

¿Ha intentado usar boost::format en su lugar? Dado que ya está usando boost, no debería ser una molestia.

boost::format("%d%%") % (b.p() * 100.0) 

Otra cosa, tratar de pasar std::endl explícitamente a la salida os.

+0

Gracias. El número aún no se muestra, pero el signo "%" está allí. Parece que el búfer en el que se cifra el número no se está creando. –

+1

Hm. Trataré de reproducir el problema entonces. – UncleZeiv

+0

Gracias. Por favor, avíseme si no puede reproducirlo y si alguna vez encuentra una solución. –

0

¿Ha intentado vaciar la secuencia antes de usar el método .str()?

oss << b.p() * 100.0 << "%" << std::flush; 
+0

Gracias, acabo de probar esto. Desafortunadamente, no funcionó. –

Cuestiones relacionadas