0

ブーストpythonで「addTwoNumbers」という関数で簡単なデモクラスをラップしようとしています。ヘッダーファイルは次のとおりです。

#ifndef DEMO_H_
#define DEMO_H_

#include <boost/function.hpp>

class Demo
{
public:
    Demo() {}
    virtual ~Demo() {}

    typedef void (DemoCb) (int,int,int);
    boost::function<DemoCb> onAddTwoNumbers;

    int addTwoNumbers(int x, int y);

    // Executes a callback within a thread not controlled by the caller.
    void addTwoNumbersAsync(int x, int y, boost::function<DemoCb> callback);

};

#endif /* DEMO_H_ */

そして、ここにラッピングがあります:

#include <boost/python.hpp>
#include "../demo.h"
using namespace boost::python;

// Create a python module using boost. The name 'demo' must match the name in the makefile
BOOST_PYTHON_MODULE(python_wrap_demo) {
    // Wrapping the addTwoNumbers function:
    class_<Demo>("Demo", init<>())
        .def("addTwoNumbers", Demo::addTwoNumbers)
    ;
}

クラスにラップされていない同様の関数でこれを機能させました。このエラーが発生するのはなぜですか?

4

2 に答える 2

1

については詳しくありませんが、メンバーのアドレスを渡すboost::pythonだけでよいと思います。非メンバー関数と静的メンバー関数は暗黙的に関数ポインターに変換できますが、非静的メンバー関数は異なり、アドレスを渡す必要があります。&.def("addTwoNumbers", &Demo::addTwoNumbers)&

于 2012-11-30T21:58:41.123 に答える
0

エラー メッセージは非常に明確です。addTwoNumbersは静的関数ではなく のメンバ関数ですDemoが、静的関数として呼び出そうとしています。Demoそれを呼び出すには、 のインスタンスが必要です。

あなたの場合、addTwoNumbersメンバー関数である必要はないので、単に静的にします。今後の参照については、http: //www.parashift.com/c++-faq/pointers-to-members.htmlを参照してください。

于 2012-11-30T22:00:51.170 に答える