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

时间:2017-08-29 10:44:25

标签: c++ c++11 lambda 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;}

但如果我在对象中声明retFun

·H

class InternalVariables : public Page
{
private:
    std::function<double ()> retFun(double* a);
};

的.cpp

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

我收到以下错误

  

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

1 个答案:

答案 0 :(得分: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有自己的匿名类型。