Hi,
I've found a bug where Boost.Python calls the wrong function overload. Here
is a small unit test:
=====
The C++ module "_test.cpp":
=====
#include
#include <string>
class Base { };
class Derived : public Base { };
std::string f(Base& b) {
return "Base";
}
std::string f(Derived& d) {
return "Derived";
}
BOOST_PYTHON_MODULE( _test )
{
using namespace boost::python;
class_<Base>("Base");
class_("Derived");
def("f", static_cast(&f));
def("f", static_cast(&f));
}
=====
The small test in python:
=====
from _test import *
f(Base())
'Base'
f(Derived())
'Base'
=====
Interestingly enough, if the function overloads are exported in the inverse
order, it actually works, i.e., if using this code:
=====
BOOST_PYTHON_MODULE( _test )
{
using namespace boost::python;
class_<Base>("Base");
class_("Derived");
def("f", static_cast(&f));
def("f", static_cast(&f));
}
=====
I do not know very well how does the boost.python registry works, but it
seems that it is selecting the first match instead of testing all matches
and selecting the "best one".