在另一个模板函数

时间:2017-07-13 10:10:59

标签: c++ templates gcc pybind11

我使用模板函数将多个函数添加到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在编译失败时输出的内容(参见W.F.下面的链接,它生成相同类型的输出而没有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>);

感谢您的帮助!

0 个答案:

没有答案