4

次の例を検討してください。

#include "Python.h"
#include <boost/python.hpp>
#include <boost/shared_ptr.hpp>

class A {};

class B : public A{};

void foo(boost::shared_ptr<A>& aptr) { }

BOOST_PYTHON_MODULE(mypy)
{
  using namespace boost::python;   
  class_<A, boost::shared_ptr<A> >("A", init<>());
  class_<B, boost::shared_ptr<B>, bases<A> >("B", init<>());
  def("foo", foo);
}

Pythonコードを呼び出すと

import mypy
b = mypy.B()
mypy.foo(b)

私は得る

ArgumentError: Python argument types in
    mypy.foo(B)
did not match C++ signature:
    foo(boost::shared_ptr<A> {lvalue})

私はかなり多くのことをグーグルで調べましたが、これに対する適切な説明/修正/回避策が見つかりません。どんな助けでも大歓迎です!

4

1 に答える 1

4

問題は、への非定数参照を要求していることshared_ptr<A>でありb、Pythonのインスタンスには単純に1つが含まれていません。が含まれていshared_ptr<B>ます。shared_ptr<B>暗黙的にに変換できますが、暗黙的にに変換することshared_ptr<A>shared_ptr<B>& できませ んshared_ptr<A>&

、、またはfooをとるように変更できる場合は、問題が解決します。shared_ptr<A>shared_ptr<A> const &

そうでない場合は、を受け入れるバージョンもラップする必要がありますshared_ptr<B>&

于 2012-05-19T01:03:14.370 に答える