1

仮想クラスの子であるC++オブジェクトがあり、Pythonでラップしようとしています。ファイルがコンパイルされ、Pythonにインポートできますが、関数を呼び出そうとすると、エラーが発生します。

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

何が問題になっていますか、そしてその理由は何ですか?

4

1 に答える 1

2

ベースではなく、オブジェクトのラップされたバージョンを渡していました。私が持っていたはずです:

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

class_<MappedBehaviourDomain, bases<BehaviourDomain> >
    ("mapped_beh", init<std::string>())
;
于 2012-12-12T17:03:16.250 に答える