Я использую pybind11
для доступа к некоторым функциям, которые я написал на C++ из python. Я хочу вернуть инициализированный экземпляр структуры в python (из функции-члена класса), чтобы я мог получить доступ к значениям экземпляра в python. Я предоставил упрощенную версию моего исходного файла. Можно воспроизвести ошибку следующим образом. Это оболочка С++
#include <pybind11/pybind11.h>
#include <pybind11/stl.h>
#include "sum.h"
namespace py = pybind11;
PYBIND11_PLUGIN(GetSum) {
py::module mod("GetSum", "wrapping caltri");
mod.def("get_instance", &GetSum::get_instance, py::return_value_policy::copy, "get instance of out");
py::class_<GetSum, std::shared_ptr<GetSum>>(mod, "GetSum")
.def(py::init<>())
.def("input", &GetSum::input);
return mod.ptr();
}
Это часть заголовка класса sum.h
extern "C" {
#include "mesh.h"
}
#include<iostream>
#include<vector>
class GetSum {
struct A out;
public:
GetSum();
void input(std::vector<float>);
struct A get_instance() {
return out; };
~GetSum();
};
Это определение класса sum.cpp
#include "sum.h"
GetSum::GetSum() {
out.pointlist = nullptr;
}
void GetSum::input(std::vector<float> num){
out.pointlist = new float[num.size()];
for(size_t i = 0; i < num.size(); i++)
*(out.pointlist+i) = num[i];
}
GetSum::~GetSum(){
delete [] out.pointlist;
}
Определение структуры: mesh.h
#include <stdio.h>
struct A {
float *pointlist;
};
и вот как я называл это в python.
import GetSum
m = GetSum.GetSum()
m.input([1.0,2.0])
GetSum.s = GetSum.get_instance()
После чего получаю ошибку: get_instance(): несовместимые аргументы функции. Поддерживаются следующие типы аргументов: 1. (arg0: GetSum) -> A
Может ли кто-нибудь помочь мне понять, где я могу ошибаться?
Спасибо!
static
. Я просто был введен в заблуждение тем, чтоget_instance
пахнет как синглтон, а это не так. - person 463035818_is_not_a_number   schedule 09.08.2017get_instance
вызывает нестатическую функцию-член без класса. Это незаконно, поскольку функции-члену требуется доступ к указателю this, который, в свою очередь, необходим для доступа к вашей переменной-членуout
. Таким образом, ваша привязка get_instance() должна быть частью определения классаGetSum
. Но этого еще недостаточно, так как ваша переменная out имеет типstruct A
, который, в свою очередь, содержит необработанный указатель. Я недостаточно знаком с pybind11, чтобы знать, как обернуть A. Что вы, вероятно, хотите сделать, так это вернуть представление данных в A. ...cont... - person Dov Grobgeld   schedule 09.08.2017