Ошибка перегрузки оператора оболочки Cython C ++ ()

Связан с моим предыдущим вопросом. Использование Cython для переноса класса C ++, использующего типы OpenCV в качестве параметров

Теперь я застрял в другой ошибке. Мой код оболочки cython типа OpenCV Matx33d выглядит так:

  • Как создать временный файл (для записи на) в C #?
  • Почему -1/2 оценивается как 0 в C ++, но -1 в Python?
  • Запустить python в C ++
  • Boost и Python 3.x
  • Импортировать модуль Python через C # .NET с помощью IronPython
  • Как я могу использовать класс C ++ в Python?
  • 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) в приведенном выше коде. Если я посмотрю на созданную строку 2528 geom_gateway.cpp, я получаю:

      *__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); 

    Я не понимаю, что этот оператор () (0, 0) там один в конце строки без какого-либо объекта !! Как это возможно? Это ошибка Cython? или является синтаксисом, который я использую для оператора () неправильно? Любая помощь приветствуется!

  • Как обернуть Tensorflow Cython и разрешить C ++ называть его?
  • установка glpk cvxopt с conda
  • Синтаксический анализ строки C ++ (стиль python)
  • Имеет ли C # что-нибудь сопоставимое с пониманием списка Python?
  • Объекты против экземпляра в python
  • Как надежно генерировать ошибки фрейма Ethernet в программном обеспечении?
  • One Solution collect form web for “Ошибка перегрузки оператора оболочки Cython C ++ ()”

    Хорошо, я не знаю, почему эта ошибка произошла, для меня это похоже на синтаксис

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

    должен работать, но это не так. Этот синтаксис работает для других операторов, таких как +, -, /, *

    Альтернативный синтаксис, который работает, следующий:

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

    то в цитовом коде, когда мы хотим использовать оператор () (i, j), вместо этого мы называем get (i, j)

    Python - лучший язык программирования в мире.