2012-12-10 2 views
1

가상 클래스의 자식 인 C++ 객체가 있는데 파이썬으로 감싸려고합니다. 이 파일은 컴파일, 나는 파이썬로 가져올 수 있습니다,하지만 난 함수를 호출 할 때, 나는 오류 얻을 : 나는 힘든 시간이 오류를 인식하지 못했습니다부스트 파이썬은 가상 클래스를 래핑했습니다 .- 자식 반환 오류 : 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}) 

을; 이것은 처음으로 부스트 파이썬으로 작업하고 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>()) 
;