Ошибка: несовместимые аргументы функции

Я использую 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

Может ли кто-нибудь помочь мне понять, где я могу ошибаться?

Спасибо!


person Surabhi Verma    schedule 09.08.2017    source источник
comment
Извините но нет. Я понятия не имею о python, не говоря уже о том, как вызвать функцию C++ из python. Тем не менее, мне было любопытно, и я хотел помочь вам поместить всю необходимую информацию в вопрос. Насколько я могу судить, ваш вопрос значительно улучшился. Теперь вам просто должно повезти, чтобы кто-то нашелся, кто действительно может ответить на него;)   -  person 463035818_is_not_a_number    schedule 09.08.2017
comment
p.s. Я буду удалять все спам-комментарии...   -  person 463035818_is_not_a_number    schedule 09.08.2017
comment
@tobi303 Хорошо.. На самом деле, когда я передал объект класса после изменения типа возвращаемого значения как статической структуры A.. Это сработало.. Но теперь, когда я везде добавляю static перед структурой.. Я получаю эту ошибку: класс хранения может быть только указано для объектов и функций }; Любая идея .. Как вы думаете, есть ли ошибка на стороне С++?   -  person Surabhi Verma    schedule 09.08.2017
comment
извините, забудьте о static. Я просто был введен в заблуждение тем, что get_instance пахнет как синглтон, а это не так.   -  person 463035818_is_not_a_number    schedule 09.08.2017
comment
Есть несколько проблем с вашим кодом. Привязка к get_instance вызывает нестатическую функцию-член без класса. Это незаконно, поскольку функции-члену требуется доступ к указателю this, который, в свою очередь, необходим для доступа к вашей переменной-члену out. Таким образом, ваша привязка get_instance() должна быть частью определения класса GetSum. Но этого еще недостаточно, так как ваша переменная out имеет тип struct A, который, в свою очередь, содержит необработанный указатель. Я недостаточно знаком с pybind11, чтобы знать, как обернуть A. Что вы, вероятно, хотите сделать, так это вернуть представление данных в A. ...cont...   -  person Dov Grobgeld    schedule 09.08.2017
comment
...продолжение... Я предлагаю вам взглянуть на привязку буферного протокола pybind11, которая создана именно для этого. См.: pybind11.readthedocs.io/en/stable/advanced/pycpp/ numpy.html   -  person Dov Grobgeld    schedule 09.08.2017


Ответы (1)


Вам нужно объявить struct A в pybind11, прежде чем его можно будет использовать в качестве возвращаемого типа, добавив как минимум:

py::class_<A>(mod, "A")
  .def(py::init<>());

к вашему коду оболочки. Кроме того, поскольку get_instance не является статическим, вам нужно вызвать его следующим образом в вашем примере кода Python:

GetSum.s = GetSum.get_instance(m)
person Wim Lavrijsen    schedule 17.11.2019