我正在使用模板函数向 pybind11 生成的 python 模块添加几个函数。
下面的简化代码可以很好地与 MSVC 一起编译。然而,如果 (decltype ...) 转换被留下注释,则使用 gcc-6.3 编译会失败。
我很困惑,因为这种转换对我来说似乎毫无用处:如果编译器能够使用 decltype 推断出类型,那么它应该能够在没有它的情况下进行。这是一个 gcc 错误吗?
#include <pybind11/pybind11.h>
namespace py = pybind11;
template <typename T>
auto f() { /* do something */ };
template <typename T>
void add_function(py::module& module, const char *name)
{
module.def(name, /*(decltype(&f<T>))*/ &f<T>);
}
PYBIND11_PLUGIN(Foo)
{
py::module module("Foo", "");
add_function<int>(module, "f");
return module.ptr();
}
这是 gcc 编译失败时输出的内容(参见 WF 下面的链接,它在没有 pybind11 的情况下产生相同类型的输出):
./foo.cpp: In instantiation of ‘void add_function(pybind11::module&, const char*) [with T = int]’:
./foo.cpp:17:31: required from here
./foo.cpp:11:2: error: no matching function for call to ‘pybind11::module::def(const char*&, <unresolved overloaded function type>)’
module.def(name, /*(decltype(&f<T>))*/ &f<T>);
^~~~~~
In file included from ./foo.cpp:1:0:
/home/simon/local/include/pybind11/pybind11.h:732:13: note: candidate: template<class Func, class ... Extra> pybind11::module& pybind11::module::def(const char*, Func&&, const Extra& ...)
module &def(const char *name_, Func &&f, const Extra& ... extra) {
^~~
/home/simon/local/include/pybind11/pybind11.h:732:13: note: template argument deduction/substitution failed:
./foo.cpp:11:2: note: couldn't deduce template parameter ‘Func’
module.def(name, /*(decltype(&f<T>))*/ &f<T>);
谢谢你的帮助!