returns lambda 表达式的方法中的转换错误
Conversion error in a method that returns a lambda expression
这段代码没有问题:
#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;};
}
我得到以下错误
error: could not convert ‘InternalVariables::retFun(double*)::__lambda44{a}’ from ‘InternalVariables::retFun(double*)::__lambda44’ to ‘std::function’
return [a](double b){ return b+ *a;};
std::function<double ()>
意味着您的包装函数 object 将不带任何参数并且 return 一个 double
。 [a](double b){ return b+ *a;}
是一个带有 double
和 return 的 lambda double
。两个签名不匹配。
您应该将 return 类型更改为 std::function<double (double)>
。
还有:
标准库 headers 应包含在 <...>
中。示例:<iostream>
.
不需要在堆上分配 double
来获取指向它的指针。只需在堆栈上的 double
上使用 &
。 C++11 中的分配应该始终通过 智能指针 完成,不要使用 new
/delete
.
您可能只想 return auto
而不是 std::function
。后者是任何函数 object 的 type-erased 包装器。 Lambda 有自己的匿名类型。
这段代码没有问题:
#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;};
}
我得到以下错误
error: could not convert ‘InternalVariables::retFun(double*)::__lambda44{a}’ from ‘InternalVariables::retFun(double*)::__lambda44’ to ‘std::function’ return [a](double b){ return b+ *a;};
std::function<double ()>
意味着您的包装函数 object 将不带任何参数并且 return 一个 double
。 [a](double b){ return b+ *a;}
是一个带有 double
和 return 的 lambda double
。两个签名不匹配。
您应该将 return 类型更改为 std::function<double (double)>
。
还有:
标准库 headers 应包含在
<...>
中。示例:<iostream>
.不需要在堆上分配
double
来获取指向它的指针。只需在堆栈上的double
上使用&
。 C++11 中的分配应该始终通过 智能指针 完成,不要使用new
/delete
.您可能只想 return
auto
而不是std::function
。后者是任何函数 object 的 type-erased 包装器。 Lambda 有自己的匿名类型。