2012-05-18 45 views
4

請看下面的例子:轉換升壓:: shared_ptr的中的boost :: python的函數調用

#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}) 

我搜索了很多,但我找不到一個很好的解釋/修復/解決方法。任何幫助都非常歡迎!

+0

如果你有'foo'採取'boost :: python :: object'參數,然後從中提取'shared_ptr',會發生什麼? – Useless

+0

當然,這是可行的,但我希望沒有爲foo編寫任何額外的包裝會有一種方法(我會需要相當多的包裝) – Hans

回答

4

問題是你要求一個非const引用一個shared_ptr<A>,而你的b實例在Python中根本不包含一個;它包含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>&的版本。