Boost Python 1.63(python 2.7.13)は、shared_ptr<T>
でうまく動作します。私はC++でこれを書いた場合:shared_ptrでのBoost Pythonの使用<const T>
shared_ptr<Foo> create_shared_ptr() { return shared_ptr{...}; }
void accept_shared_ptr(const shared_ptr<Foo>& p) { }
...
class_<Foo, boost::noncopyable>("Foo", no_init); //Expose abstract class
register_ptr_to_python< shared_ptr<Foo> >();
def("create_shared_ptr", create_shared_ptr);
def("accept_shared_ptr", accept_shared_ptr);
それから私はPythonでこれを書くことができ、すべてが動作します:
accept_shared_ptr(create_shared_ptr())
私がしようとshared_ptr<const Foo>
を包むときに問題が来ます。(私はこれを返すライブラリをラップしていますので、実行する必要があり、どの。)次のように私はC++の機能を変更する場合:
shared_ptr<const Foo> create_shared_ptr() { return shared_ptr{...}; }
void accept_shared_ptr(const shared_ptr<const Foo>& p) { }
その後、私はエラーを取得する:
Boost.Python.ArgumentError: Python argument types in mod_python.accept_shared_ptr(Foo) did not match C++ signature: accept_shared_ptr(std::shared_ptr<Foo const>)
それはそうです内部ではPython Foo
からC++ shared_ptr<Foo>
への変換を実装していますが、C++ shared_ptr<const Foo>
には変換を実装していません。使用する
register_ptr_to_python< shared_ptr<const Foo> >();
は役に立ちません。これをどうすれば解決できますか?
閉じるに投票した人へ:1.62のブーストに基づく以下の答えでは問題は解決されません。 Boost 1.62は9月1日にリリースされ、1.62は11月2日にリリースされました。(https://github.com/boostorg/python/commit/97e4b34a15978ca9d7c296da2de89b78bba4e0d5 )。このコミットが何かを壊した可能性があります。 – Mohan