Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在另一个模板函数内使用模板函数指针_C++_Templates_Gcc_Pybind11 - Fatal编程技术网

C++ 在另一个模板函数内使用模板函数指针

C++ 在另一个模板函数内使用模板函数指针,c++,templates,gcc,pybind11,C++,Templates,Gcc,Pybind11,我正在使用一个模板函数向pybind11生成的python模块添加几个函数 下面的简化代码可以很好地使用MSVC编译。 但是,如果(decltype…)转换未被注释,则使用gcc-6.3进行编译将失败 我很困惑,因为这种转换对我来说似乎毫无用处:如果编译器能够使用decltype推断类型,那么它应该能够在没有decltype的情况下进行。这是一个gcc错误吗 #包括 名称空间py=pybind11; 模板 自动f(){/*做某事*/}; 模板 void add_函数(py::module&mod

我正在使用一个模板函数向pybind11生成的python模块添加几个函数

下面的简化代码可以很好地使用MSVC编译。 但是,如果(decltype…)转换未被注释,则使用gcc-6.3进行编译将失败

我很困惑,因为这种转换对我来说似乎毫无用处:如果编译器能够使用decltype推断类型,那么它应该能够在没有decltype的情况下进行。这是一个gcc错误吗

#包括
名称空间py=pybind11;
模板
自动f(){/*做某事*/};
模板
void add_函数(py::module&module,const char*name)
{
module.def(名称,/*(decltype(&f))*/&f);
}
PYBIND11_插件(Foo)
{
py::模块模块(“Foo”,“Foo”);
添加_功能(模块,“f”);
返回模块.ptr();
}
这里是gcc在编译失败时输出的内容(参见下面W.F.提供的链接,该链接在没有pybind11的情况下生成相同类型的输出):

/foo.cpp:void add_函数(pybind11::module&,const char*)[with T=int]的实例化:
/foo.cpp:17:31:从这里开始需要
./foo.cpp:11:2:错误:调用'pybind11::module::def(const char*&,')时没有匹配的函数
module.def(名称,/*(decltype(&f))*/&f);
^~~~~~
包含在文件中的./foo.cpp:1:0:
/home/simon/local/include/pybind11/pybind11.h:732:13:注意:候选:模板pybind11::module&pybind11::module::def(const char*,Func&&&,const Extra&…)
模块和定义(常量字符*名称、函数和函数、常量额外和…额外){
^~~
/home/simon/local/include/pybind11/pybind11.h:732:13:注意:模板参数推断/替换失败:
./foo.cpp:11:2:注意:无法推断模板参数“Func”
module.def(名称,/*(decltype(&f))*/&f);
感谢您的帮助!

我认为这与mcve很接近,看起来clang对仅代码的gcc没有问题。这看起来像是。从该报告来看,另一个解决方法似乎是在尝试绑定之前添加
(void)f;
./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>);