此代码可以正常运行:
#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;};
答案 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有自己的匿名类型。