error: cannot convert ‘<lambda(double)>’ to ‘double (*)(double)’
error: cannot convert ‘<lambda(double)>’ to ‘double (*)(double)’
我有这个错误
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
保留在我的函数本地来解决它?
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));
}
并在您的 cpp 文件顶部添加 #include <functional>
。
您只能转换 。在您的情况下,您的 lambda 通过复制捕获 alea
,因此无法转换为函数指针类型。
您有两个选择:
- 要么使用
std::function
with some type-eraser overhead.
- 或者将函数作为模板函数,以便编译器可以推断出 lambda 的类型。
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));
}
我有这个错误
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
保留在我的函数本地来解决它?
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));
}
并在您的 cpp 文件顶部添加 #include <functional>
。
您只能转换 alea
,因此无法转换为函数指针类型。
您有两个选择:
- 要么使用
std::function
with some type-eraser overhead. - 或者将函数作为模板函数,以便编译器可以推断出 lambda 的类型。
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)); }