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

时间:2015-07-03 07:47:04

标签: python c++ templates cython

我正在尝试包含一个严格模板化的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用户邮件列表中。

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

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

Cython无法推断出该函数调用的类型参数 因为第二个参数的类型不同(size_t vs long)。 它应该隐式地将参数转换为C ++在搜索(模板化)重载时所执行的操作,但是当它的类型时它会中止模板推导。 非模板size_t参数不匹配。

要使模板扣除成功,您可以编写get(c, <size_t>1)(或将第二个参数存储在size_t类型的变量中,然后再将其传递给get()

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

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