Boost-Python-Laufzeitfehler beim Übergeben eines Objekts des abgeleiteten Typs von Python an die C ++ - Funktion, wobei ein shared_ptr als Basistyp erwartet wird

Ich habe eine Funktion, die std :: shared_ptr akzeptiert, und ich möchte ein Objekt vom Typ Derived von Python an diese Funktion übergeben. Hier sind meine Klassendefinitionen:

struct AbstractBase {
    virtual void foo() = 0;
};

struct Derived : public AbstractBase {
    virtual void foo(){
        std::cout<<"Derived's foo!"<<std::endl;
    }
};

struct Unrelated {
    void bar(std::shared_ptr<AbstractBase> base_shared_ptr) {
        base_shared_ptr->foo();
    }
};
#endif /* CLASSES_H */

Ein einfaches reines C ++ Beispiel macht was ich will:

int main()
{
    std::shared_ptr<Derived> d(new Derived);
    Unrelated u;
    u.bar(d);
}

Ausgabe:Derived's foo!

Hier ist mein Boost.Python-Wrapper-Code:

#include <boost/python.hpp>
#include "classes.h"


BOOST_PYTHON_MODULE(shared_ptr_test) {
    using namespace boost::python;
    class_<AbstractBase,std::shared_ptr<AbstractBase>,boost::noncopyable>("AbstractBase",no_init);

    class_<Derived,std::shared_ptr<Derived>,bases<AbstractBase>,boost::noncopyable>("Derived");

    class_<Unrelated,std::shared_ptr<Unrelated>,boost::noncopyable>("Unrelated")
        .def("bar",&Unrelated::bar);
}

Und hier ist mein einfacher Python-Test:

import shared_ptr_test

d=shared_ptr_test.Derived()
u=shared_ptr_test.Unrelated()
u.bar(d)

Zu meiner Bestürzung funktioniert das nicht. Es lässt sich problemlos kompilieren, aber wenn ich das Python-Skript ausführe, erhalte ich folgende Fehlermeldung:

Traceback (most recent call last):
  File "test.py", line 5, in <module>
    u.bar(d)
Boost.Python.ArgumentError: Python argument types in
    Unrelated.bar(Unrelated, Derived)
did not match C++ signature:
    bar(Unrelated {lvalue}, std::shared_ptr<AbstractBase>)

Ändernbar etwas nehmenshared_ptr<Derived> behebt dies, so dass ich weiß, dass Boost.Python die Objekte intern mit verwaltetshared_ptrs. Muss ich noch etwas tun, damit Boost.Python merkt, dass es in Ordnung ist, einen Test zu bestehen?shared_ptr<Derived> zu einer Funktion, die a erwartetshared_ptr<Base>?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage