[C++-sig] Interfacing pure abstract classes with Boost.Python

Pere Mato Vila Pere.Mato at cern.ch
Thu Jan 23 19:40:40 CET 2003

Hi all,

  I have problems interfacing pure abstract classes, which I do not
intend to extent from the Python side, with version 2 of Boost.Python.

The class IHistogram is defined as

class IHistogram   {
  virtual int dimension (  ) const = 0;

I expose it as

  python::class_<IHistogram, boost::noncopyable > ("IHistogram",
python::no_init )
    .def("dim",   &IHistogram::dimension )

And I provide the method iHistogramSvc::book1D(...) which returns an
IHistogram* and is exposed as

     ( "IHistogramSvc", python::init<IHistogramSvc*>() )
    .def("book",       &GaudiPython::iHistogramSvc::book1D )

So far so good. I am able to compile and produce the Python extension
module. But, when I run the Python code I get:

>>> gaudi.IHistogram1D
<class 'gaudimodule.IHistogram1D'>
>>> h1 = his.book('1', 'histogram title', 10, 0, 10)
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
TypeError: No to_python (by-value) converter found for C++ type: class

  What I am doing wrong? In the old version I was able to work around
the problem by adding the lines in the C++ module extension 

PyObject* to_python(IHistogram* p) {

  And obviously this is not working.

Pere Mato  CERN, EP Division, CH 1211 Geneva 23, Switzerland
           e-mail: Pere.Mato at cern.ch    tel: +41 22 76 78696
           fax:  +41 22 76 79425        gsm: +41 79 20 10855


More information about the Cplusplus-sig mailing list