无法推断全局函数中的类型参数

Unable to deduce type parameters in global function

我正在尝试包装一个高度模板化的 C++ 库,该库使用 类 和作用于它们的全局函数。

我想知道为什么在下面的示例中,Cython 编译器在 get(c, 1) 中给我错误“无法推断类型参数”,而我对它前面的行没有任何抱怨:

cdef extern from "file.h":
  cdef cppclass Container[T]:
    pass

  T get_first[T](Container[T])
  T get[T](Container[T], size_t)

cdef Container[int] c
get_first(c)
get(c, 1)

file.h 的内容不相关,因为该消息是由 Cython 编译器发出的,它不查看文件(它只为其生成一个 #include 语句)。即使文件不存在也可以重现该问题。

这个问题也已于 7 月 1 日发布到 Cython 用户邮件列表。

这看起来像是 Cython 中的错误。

Cython 无法推断出该函数调用的类型参数 因为第二个参数的类型不同(size_t vs long)。 它应该像 C++ 在搜索(模板化的)重载时那样隐式转换参数,但是当 非模板 size_t 参数不匹配。

为了使模板推导成功,可以写get(c, <size_t>1)(或者将第二个参数存储在size_t类型的变量中,然后再传递给get())。

要自己指定所需的模板并完全跳过模板推导,您可以按照 DavidW 所说并编写 get[int](c, 1)

我已将技术细节发布到 Cython 用户邮件列表。

此错误已在最近的 cython 版本中修复。至少从 Cython 0.25.2 开始,上面的代码可以毫无问题地编译。