2012-12-10 33 views
1

我有一個C++對象是虛擬類的孩子,我試圖用python包裝。該文件編譯的,我可以將它導入蟒蛇,但是當我嘗試調用的函數,我得到一個錯誤:Boost Python包裝的虛擬類 - 孩子返回​​錯誤:不匹配C++簽名

In [3]: x 
Out[3]: <beh.MappedBehaviourDomain at 0x23e7158> 

//So, obviously the constructor is working (or at least thinks it is) 

In [4]: x.subject_count() 
--------------------------------------------------------------------------- 
ArgumentError        Traceback (most recent call last) 
/home/max/verk/btr-email/build/x86_64/bin/ipython in <module>() 
----> 1 x.subject_count() 

ArgumentError: Python argument types in 
    BehaviourDomainWrap.subject_count(MappedBehaviourDomain) 
did not match C++ signature: 
    subject_count(BehaviourDomainWrap {lvalue}) 
    subject_count(BehaviourDomainWrap {lvalue}) 

我有一個很難理解這個錯誤信息;這是我第一次使用boost python,並且我沒有太多的C++經驗。以下是相關的代碼:

// Instantiating class for use in boost python 
struct BehaviourDomainWrap : BehaviourDomain, wrapper<BehaviourDomain> 
{ 
    size_t subjectCount() const { 
     return this->get_override("subjectCount")(); 
    // A bunch of other methods removed 
} 


BOOST_PYTHON_MODULE(beh) { 

    class_<BehaviourDomainWrap, boost::noncopyable>("BehaviourDomainWrap") 
     .def("subject_count", pure_virtual(& BehaviourDomainWrap::subjectCount)) 
    ; 

    class_<MappedBehaviourDomain, bases<BehaviourDomainWrap> > 
     ("MappedBehaviourDomain", init<std::string>()) 
    ; 
} 

怎麼回事,爲什麼?

回答

2

我傳遞的是對象的包裝版本而不是基礎。我應該有:

class_<BehaviourDomainWrap, boost::noncopyable>("beh") 
    .def("subject_count", pure_virtual(& BehaviourDomain::subjectCount)) 
; 

class_<MappedBehaviourDomain, bases<BehaviourDomain> > 
    ("mapped_beh", init<std::string>()) 
; 
相關問題