返回lambda表达式的方法中的转换错误

Pie*_*aud 2 c++ lambda c++11 std-function

这段代码没有问题:

#include "iostream"
#include  "functional"
std::function<double (double)> retFun(double* a) {
     return [a](double x) { return x+*a; };
 }

 int main(){

 double*e = new double(3);
 std::cout << retFun(e)(3) << std::endl;}
Run Code Online (Sandbox Code Playgroud)

但如果我retFun在一个对象中声明:

.H

class InternalVariables : public Page
{
private:
    std::function<double ()> retFun(double* a);
};
Run Code Online (Sandbox Code Playgroud)

的.cpp

std::function<double ()> InternalVariables::retFun(double *a)
{
    return [a](double b){ return b+ *a;};
}
Run Code Online (Sandbox Code Playgroud)

我得到以下错误

错误:无法将'InternalVariables :: retFun(double*):: __ lambda44 {a}'从'InternalVariables :: retFun(double*):: __ lambda44'转换为'std :: function'返回[a](双b) {return b +*a;};

Vit*_*meo 6

std::function<double ()>意味着你的包装函数对象不带参数并返回一个double.[a](double b){ return b+ *a;}是一个lambda,它取一个double并返回一个double.这两个签名不匹配.

您应该将退货类型更改为std::function<double (double)>.


也:

  • 标准库标题应包含在内<...>.示例:<iostream>.

  • 没有必要double在堆上分配一个指针来获取它.只需使用&double在堆栈中.C++ 11中的分配应始终通过智能指针完成,不要使用new/ delete.

  • 您可能只想返回auto而不是std::function.后者是任何函数对象上的类型擦除包装器.Lambdas有自己的匿名类型.