Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.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/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
C++ 模板参数类型推断赢得';不能在函数对象中工作_C++_Templates_Std Function_Type Deduction - Fatal编程技术网

C++ 模板参数类型推断赢得';不能在函数对象中工作

C++ 模板参数类型推断赢得';不能在函数对象中工作,c++,templates,std-function,type-deduction,C++,Templates,Std Function,Type Deduction,我有一个模板函数,它接受另一个参数类型为模板的函数 使用它时,我必须显式地指定参数类型(1),否则它将无法编译(2) 模板 无效过程(const std::function&f) { // ... } 进程([&](constfoo&arg){/*…*/});//(1) 好的! //进程([&](constfoo&arg){/*…*/});//(2) 不行! 有什么诀窍可以让(2)工作吗?让编译器找出整个函数的确切类型: template<typename T> void proc

我有一个模板函数,它接受另一个参数类型为模板的函数

使用它时,我必须显式地指定参数类型(1),否则它将无法编译(2)

模板
无效过程(const std::function&f)
{
// ...
}
进程([&](constfoo&arg){/*…*/});//(1) 好的!
//进程([&](constfoo&arg){/*…*/});//(2) 不行!

有什么诀窍可以让(2)工作吗?

让编译器找出整个函数的确切类型:

template<typename T>
void process(T&& f)
{
   // ...
}
模板
无效流程(T&f)
{
// ...
}

现在两个函数调用都可以工作了。

只需让编译器计算出整个函数的确切类型:

template<typename T>
void process(T&& f)
{
   // ...
}
模板
无效流程(T&f)
{
// ...
}

现在您的函数调用都会起作用。

为什么您在代码中引用了一个“代码< ST/:>函数”代替了一个泛型函数?C++版本??@ BoeTiSOS在没有旧标签的情况下,[C++ ]表示最新的C++,所以C++ 14现在不起作用,因为lambda的闭合类型必须转换为<代码> STD::函数< />它不匹配函数参数类型,因为你要在一个<代码> STD::函数< /C> >代替一个泛型函数?C++版本??@ BoeTiSOS在没有旧标签的情况下,[C++ ]表示最新的C++,因此,C++14现在不起作用,因为lambda的闭包类型必须转换为
std::function
,它与要进行推断的函数参数类型不匹配。如何约束具有特定签名的函数?void(const TYPE&)如何约束具有特定签名的函数?void(常量类型&)