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;};
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有自己的匿名类型.
归档时间: |
|
查看次数: |
53 次 |
最近记录: |