Использование указателя на функцию шаблона внутри другой функции шаблона

Я использую шаблонные функции, чтобы добавить несколько функций в мой модуль python, сгенерированный pybind11.

Следующий упрощенный код прекрасно компилируется с MSVC.
Тем не менее, компиляция с gcc-6.3 завершится неудачно, если преобразование (decltype …) останется закомментированным.

Я сбит с толку, потому что это преобразование кажется мне бесполезным: если компилятор может определить тип с помощью 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>);

Спасибо за вашу помощь!

2

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]