从类型 'MyStruct' 转换为类型 'void*' 无效

Invalid cast from type 'MyStruct' to type 'void*'

本文关键字:类型 无效 void MyStruct 转换      更新时间:2023-10-16

我在以下头文件中定义了一个名为Spiketimesolver的结构:

#include <math.h>
#include "plot_support.h"
struct Spiketimesolver {
  const Doub tau_0, I_0, V_start, I_start;
Spiketimesolver(const Doub tau_0, const Doub I_0, const Doub V_start,
                const Doub I_start) :
  tau_0(tau_0), I_0(I_0), V_start(V_start), I_start(I_start)
  {}
  Doub operator()(const Doub t) {
    const Doub I = get_I(I_start, t, tau_0);
    const Doub V = get_V(I_start, t, tau_0, I_0, V_start, I);
    return 0.5 * pow((V - 1), 2);
  }
};

get_Iget_V在我的文件plot_support.h中定义。它们的定义在这里无关。)

在一个单独的模块中,我如下实例化这个结构:

Spiketimesolver solver(tau_0, I_0, V_start, I_start);

这里,所有的论点都是双重的。

我想把solver传递给我这样定义的函数:

template<class T> PyObject* NRpyObject(T &a) {
// default applies to all function objects or other structs
    PyObject *thing = PyCapsule_New((void*)a,NULL,NULL);
    return thing;
}

PyCapsule_New是Python C API的一部分。它期望void *pointer作为第一个参数。

当我尝试编译时,调用NRpyObject(solver):会出现以下错误

In file included from analysis_cmodule.cpp:2:0:
nr3python.h: In instantiation of ‘PyObject* NRpyObject(T&) [with T = Spiketimesolver; PyObject = _object]’:
analysis_cmodule.cpp:16:27:   required from here
nr3python.h:183:52: error: invalid cast from type ‘Spiketimesolver’ to type ‘void*’
  PyObject *thing = PyCapsule_New((void*)a,NULL,NULL);
                                                    ^

我做错了什么?

PyCapsule_New的第一个参数需要是指针。您正试图通过将a强制转换为void*来实现这一点。然而,编译器不喜欢这样。我猜你需要使用:

PyObject *thing = PyCapsule_New(&a,NULL,NULL);