2017-11-29 24 views
1

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> >(); 

は役に立ちません。これをどうすれば解決できますか?

+0

閉じるに投票した人へ:1.62のブーストに基づく以下の答えでは問題は解決されません。 Boost 1.62は9月1日にリリースされ、1.62は11月2日にリリースされました。(https://github.com/boostorg/python/commit/97e4b34a15978ca9d7c296da2de89b78bba4e0d5 )。このコミットが何かを壊した可能性があります。 – Mohan

答えて

1

問題は、クラス/メソッドの定義に含まれている必要があります。このコードは、私の作品(私は1.62とPython 2.7.13を後押ししている):

class Foo { 
public: 
    virtual ~Foo() = default; 
    virtual std::string xxx() = 0; 
}; 

class Bar: public Foo { 
public: 
    ~Bar() override = default; 
    std::string xxx() override { return "xxx"; } 
}; 

std::shared_ptr<const Foo> create_shared_ptr() { 
    return std::shared_ptr<const Foo>(new Bar); 
} 

void accept_shared_ptr(const std::shared_ptr<const Foo>& p) 
{ 
    ; // do nothing 
} 

BOOST_PYTHON_MODULE(myLib) 
{ 
    using namespace boost::python; 
    class_<Foo, boost::noncopyable>("Foo", no_init); 
    register_ptr_to_python< std::shared_ptr<const Foo> >(); 
    def("create_shared_ptr", create_shared_ptr); 
    def("accept_shared_ptr", accept_shared_ptr); 
} 

を次に、私が行うことができますpythonで:

$ python 
Python 2.7.13 (default, Jan 19 2017, 14:48:08) 
[GCC 6.3.0 20170118] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import myLib 
>>> ptr = myLib.create_shared_ptr() 
>>> ptr 
<myLib.Foo object at 0x7f8b5fde0aa0> 
>>> myLib.accept_shared_ptr(ptr) 

おそらくあなたの関数create_shared_ptrは何とかその間違った値を返します。 Pythonによって誤解されています。

implicitly_convertible<std::shared_ptr<Foo>,std::shared_ptr<const Foo>>(); 

追加

+0

興味深い。あなたのC++コードを私のために同じエラーを生成します。 myLib.accept_shared_ptr(フー) で '' 'Pythonの引数の型は、C++の署名と一致しませんでした: accept_shared_ptr(STD :: shared_ptrの)' '' – Mohan

+0

は私が何を求めることができますコンパイラを使用していますか?私はg ++ 6.4を使い、 '-std = C++ 11'でコンパイルしています。また、コンバージョンを増やす可能性のあるヘッダーも含めていますか? – Mohan

+1

'g ++(Debian 6.3.0-18)6.3.0 20170516'、' -std = C++ 1y'(私はC++ 14でなければなりません)、 'cmake version 3.7.2'です。 boostには '#include 'だけが含まれていましたが、実際OpenCVの依存関係を含む他のプロジェクトにサンプルコードを埋め込んでいました。私はその問題が解決されるのを見る - 良い(たとえ少しでもハッキリであっても)。 – Ptaq666

0

は、問題を解決します。