Opened 21 years ago

Closed 19 years ago

#925 closed Bugs (None)

export inhereted method under gcc fails

Reported by: andreitd Owned by: david_abrahams
Milestone: Component: python USE GITHUB
Version: None Severity:
Keywords: Cc:

Description

When I try to export a method inhereted from some base
class, I get compilation errors unless I also export
the base class. I've got a feeling it's compiler bug
(gcc 2.96), 
but I am not entirely sure.

....................................
  class Base {
  public:
    int f(int i) { return -i; }
  };

  class Derived : public Base {
  };

BOOST_PYTHON_MODULE_INIT(ex_pmf_ext)
{
  try
  {
    python::module_builder this_module("ex_pmf_ext");

    python::class_builder<Derived>
derived_class(this_module, "Derived");

    derived_class.def(python::constructor<>());

    derived_class.def(&Derived::f, "f");

  }
  catch(...)
  {
    python::handle_exception(); 
  }
}

.......................

The compiler says it can't find 'from_python()'
function for 'Base' class. The error message also shows
that the compiler sees '&Base::f' pointer-to-member
instead of 
'&Derived::f'. That silent  conversion seems to be a
primary cause of the entire problem.
 ...instantiated from
`boost::python::detail::wrapped_function_pointer<R,
F>::do_call (PyObject *, PyObject *) const [with R =
int, F = int ({unnamed}::Base::*) (int)]'...

If I add 
...
 python::class_builder<Base> base_class(this_module,
"Base");
derived_class.declare_base(base_class,python::without_downcast);
...
then everything works. However, it's obviously a
nuisance since the entire class hierarchy may be quite
convoluted or undocumented in general case (inhereted
from 
vendor-supplied library, for instance), and I only care
about using this method through my 'Derived' class, not
the 'Base' class directly. Is this a bug in the
compiler (it 
does not have the right to replace  &Derived::f with
&Base::f, does it)?  Of cause, I can define and export
functions like
  int f(Derived *self,int i) {
    return self->f(i);
  }


Change History (1)

comment:1 by david_abrahams, 19 years ago

Status: assignedclosed
Note: See TracTickets for help on using tickets.