我有这个错误
error: cannot convert ‘<lambda(double)>’ to ‘double (*)(double)’
从代码来看
void Matrice::mapEmplace(double (*fct)(double))
{
for (size_t i = 1; i <= nLig; ++i)
for (size_t j = 1; j <= nCol; ++j)
(*this)(i, j) = (*fct)((*this)(i, j));
}
--
void function()
{
// ...
bool alea = something;
// alea results on reading in a file
utilisation.mapEmplace(
[alea](double x) -> double {
return alea ? 1 : 0;
}
);
//....
}
当我没有捕捉到 alea
例如,通过声明全局,它可以工作。但当我声明 alea
在我的函数g++的范围内显示这个错误。
你知道问题出在哪里吗,我如何解决这个问题,通过保持 alea
本地到我的函数?
你只能转换 将不需要捕获的lambda转换为c-style函数指针。. 在你的情况下,你的lambda捕捉到了。alea
通过复制,因此无法转换为函数指针类型。
你有两个选择。
std::function
带点 橡皮擦.template<typename T>
void Matrice::mapEmplace(T fct)
{
for (size_t i = 1; i <= nLig; ++i)
for (size_t j = 1; j <= nCol; ++j)
(*this)(i, j) = fct((*this)(i, j));
}
std::function
是为了处理一个捕获lambda而明确设计的。 所以,把这个。
void Matrice::mapEmplace(double (*fct)(double)) {
for(size_t i = 1; i <= nLig; ++i)
for(size_t j = 1; j <= nCol; ++j)
(*this)(i,j) = (*fct)((*this)(i,j));
}
用这个代替
void Matrice::mapEmplace(std::function<double(double)> fct) {
for(size_t i = 1; i <= nLig; ++i)
for(size_t j = 1; j <= nCol; ++j)
(*this)(i,j) = fct((*this)(i,j));
}
然后加上 #include <functional>
在你的cpp文件的顶部。