Cython“模板参数中的未知类型”错误

Posted

技术标签:

【中文标题】Cython“模板参数中的未知类型”错误【英文标题】:Cython "Unknown type in template argument" error 【发布时间】:2018-06-06 09:31:04 【问题描述】:

我正在尝试为以下 C++ 类创建 Python 包装器。

A(vector<pair<double, double>>* points, double r_cutoff) 
void func(vector<pair<double, double>>* offset)

To Python wrapper 获取 Numpy 的 ndarray 作为参数并从中创建一个向量。然后,它尝试将地址传递给 C++ 构造函数及其函数“func”。

cdef extern from "cell.h" namespace "cl":
    cdef cppclass A:
        A(vector[pair[double, double]]* points, double r_cutoff) except +
        void func(vector[pair[double, double]]* offset)

cdef class PyA:
    cdef A* thisptr
    def __cinit__(self, np.ndarray points, double r_cutoff):
        cdef vector[pair[double, double]] vec
        vec.resize(points.shape[0])
        for i in range(points.shape[0]):
            vec[i].first = points[i][0]
            vec[i].second = points[i][1]

        self.thisptr = new A(&vec, r_cutoff)

    def func(self, np.ndarray offset):
        cdef vector[pair[double, double]] vec
        vec.resize(offset.shape[0])

        for i in range(offset.shape[0]):
            vec[i].first = offset[i][0]
            vec[i].second = offset[i][1]
        self.thisptr.func(&vec)

但它抱怨有一个未知的类型在

  def func(self, np.ndarray offset):
        cdef vector[pair[double, double]] vec
                        ^
------------------------------------------------------------

file.pyx:27:25: unknown type in template argument

我正确地导入了向量和对,但我不明白为什么 Cython 会抱怨这个。任何帮助将不胜感激!

【问题讨论】:

【参考方案1】:

您需要导入vectorpair 的定义,以便Cython 知道它们,即:

from libcpp.vector cimport vector
from libcpp.utility cimport pair
....

【讨论】:

你真是个天才。

以上是关于Cython“模板参数中的未知类型”错误的主要内容,如果未能解决你的问题,请参考以下文章

Cython 编译错误“常量表达式中不允许”

OSX 的 Cython 链接错误

Cython 缓冲区协议示例错误

Cython -std=c++11 错误,同时使用 C 和 C++

Cython 中的枚举成员名称重复 - 重新声明错误?

Cython:“致命错误:numpy/arrayobject.h:没有这样的文件或目录”