Opened 15 years ago

Last modified 4 years ago

#1460 reopened Bugs

Python classes with multiple bases are convertible only to the first class in the lists (even if super(classname, self).__init__() is called)

Reported by: Piotr Jaroszyński <p.jaroszynski@…> Owned by: Dave Abrahams
Milestone: To Be Determined Component: python USE GITHUB
Version: Boost 1.34.1 Severity: Problem
Keywords: Cc:

Description

first reported here: ​http://mail.python.org/pipermail/c++-sig/2007-October/012926.html

C++:
#include <boost/python.hpp>

namespace bp = boost::python;

struct A { };
struct B { };

void test_A(const A &) { }
void test_B(const B &) { }

BOOST_PYTHON_MODULE(multiple_inheritance)
{
    bp::def("test_A", &test_A);
    bp::def("test_B", &test_B);

    bp::class_<A>("A", bp::init<>());
    bp::class_<B>("B", bp::init<>());
}

Python:
class C(A, B):
    pass

test_A(C())
test_B(C())

And I get:
Traceback (most recent call last):
  File "./multiple_inheritance.py", line 10, in <module>
    test_B(C())
Boost.Python.ArgumentError: Python argument types in
    multiple_inheritance.test_B(C)
did not match C++ signature:
    test_B(B)

I will try to figure it out once I am done with the exceptions.

Change History (4)

comment:1 by Piotr Jaroszyński <p.jaroszynski@…>, 15 years ago

bleh, I wanted to choose the Python component.

comment:2 by Marshall Clow, 15 years ago

Component: None → Python
Owner: set to Dave Abrahams

comment:3 by troy d. straszheim, 13 years ago

Resolution: → invalid
Status: new → closed

You have to initialize your base classes in the derived object's constructor. I committed a passing test to git, will work its way into svn eventually:

​http://gitorious.org/~straszheim/boost/straszheim/commit/ec9c7f7b48a40bf8136597242457f40a349b2fe3

comment:4 by AnyOldName3, 4 years ago

Resolution: invalid
Status: closed → reopened
Summary: Python classes with multiple bases are convertible only to the first class in the lists → Python classes with multiple bases are convertible only to the first class in the lists (even if super(classname, self).__init__() is called)

I made a detailed comment explaining why I think this issue should be reexamined, but the spam filter ate it. Hopefully, an admin can approve it.

Note: See TracTickets for help on using tickets.