【问题标题】:Cython C++ wrapper operator() overloading errorCython C++ 包装器 operator() 重载错误
【发布时间】:2013-09-12 10:57:13
【问题描述】:

与我之前的问题有关。 Using Cython to wrap a C++ class that uses OpenCV types as parameters

现在我陷入了另一个错误。我的 OpenCV 类型 Matx33d 的 cython 包装代码如下所示:

cdef extern from "opencv2/core/core.hpp" namespace "cv":
    cdef cppclass Matx33d "cv::Matx<double, 3, 3>":
        Matx33d()
        Matx33d(double v0, double v1, double v2, double v3, double v4, double v5, double v6, double v7, double v8)
        double& operator()(int i, int j)

然后我定义一个函数将 Matx33d 复制到一个 numpy 数组中。

cdef Matx33d2numpy(Matx33d &m):
    cdef np.ndarray[np.double_t, ndim=2] np_m = np.empty((3,3), dtype=np.float64)  
    np_m[0,0]= m(0,0); np_m[0,1]= m(0,1); np_m[0,2]= m(0,2)
    np_m[1,0]= m(1,0); np_m[1,1]= m(1,1); np_m[1,2]= m(1,2)
    np_m[2,0]= m(2,0); np_m[2,1]= m(2,1); np_m[2,2]= m(2,2)    
    return np_m

当我编译 cython 包装器时出现这些错误

geom_gateway.cpp(2528) error C3861: '()': identifier not found

这对应于Matx33d::operator()的第一次使用,也就是上面代码中访问m(0,0)的时候。 如果我查看生成的 geom_gateway.cpp 第 2528 行,我会得到:

  *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_double_t *, __pyx_pybuffernd_np_m.rcbuffer->pybuffer.buf, __pyx_t_6, __pyx_pybuffernd_np_m.diminfo[0].strides, __pyx_t_7, __pyx_pybuffernd_np_m.diminfo[1].strides) = operator()(0, 0);

我不明白这个 operator()(0, 0) 单独在行尾没有任何对象!这怎么可能?这是 Cython 错误吗?还是我用于 operator() 的语法错误? 任何帮助表示赞赏!

【问题讨论】:

  • 有一个对象,它是m,它作为参数传递。
  • 抱歉,我在从 geom_gateway.cpp 复制的行(第 2528 行)中看不到作为参数传递的 m。你能指出来吗?我对python C API了解不多
  • cdef Matx33d2numpy(Matx33d &amp;m): Matx33d,通过引用传递为m
  • 好的,我明白了。问题是我得到一个编译器错误,当我查看 cython 生成的 cpp 文件中的错误行时,我没有看到“m”,我看到我粘贴的行看起来像“一些很长我不懂的 Python C API 表达式" = operator()(0, 0);并且在任何地方我都看不到 m,那应该是 m.operator()(0, 0);但是没有米!!

标签: c++ python opencv cython


【解决方案1】:

好的,我不知道为什么会发生这个错误,对我来说它看起来像语法

double& operator()(int i, int j)

...应该工作,但它没有。此语法适用于其他运算符,例如 +,-,/,*

另一种可行的语法如下:

double& get "operator()"(int i, int j)

然后在 cython 代码中,当我们想使用 operator()(i,j) 时,我们调用 get(i, j)

【讨论】:

  • 谢谢,这行得通。它帮助我包装了 boost/random 并对其进行了测试。
  • 在 Cython 2.4 中这似乎不再是问题
  • @BryceGuinta cython 2.4,它是如何进行版本控制的?我的是 0.29,所以不同
  • 我使用“operatorcdef bool "operator<"(const HeapqItem a, const HeapqItem b) --> Function signature does not match previous declaration 虽然这是唯一的地方
猜你喜欢
  • 2019-01-25
  • 1970-01-01
  • 1970-01-01
  • 2021-04-27
  • 2019-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多