Я пытаюсь обернуть простой демонстрационный класс функцией «addTwoNumbers» с надписью boost python. Вот заголовочный файл:
#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)
;
}
Я получил это, чтобы работать для аналогичной функции, которая не была включена в класс. Почему я сейчас получаю эту ошибку?
Я не знаком с boost::python
но я верю что тебе просто нужно &
передать адрес участника .def("addTwoNumbers", &Demo::addTwoNumbers)
, Не-функции и статические функции-члены могут быть неявно преобразованы в указатели на функции, но нестатические функции-члены отличаются, и вам нужно &
передать адрес.
Сообщение об ошибке очень ясно; addTwoNumbers
является функцией-членом Demo
, а не статическая функция, но вы пытаетесь вызвать ее как статическую функцию. У вас должен быть экземпляр Demo
чтобы призвать это.
В твоем случае, addTwoNumbers
не обязательно должна быть функцией-членом, поэтому просто сделайте ее статической. Для дальнейшего использования смотрите: http://www.parashift.com/c++-faq/pointers-to-members.html