错误:无法将'<lambda(double)>'转换为'double(*)(double)'[重复]。

问题描述 投票:0回答:1

我有这个错误

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 本地到我的函数?

c++ lambda compiler-errors g++
1个回答
4
投票

你只能转换 将不需要捕获的lambda转换为c-style函数指针。. 在你的情况下,你的lambda捕捉到了。alea 通过复制,因此无法转换为函数指针类型。

你有两个选择。

  1. 要么使用 std::function 带点 橡皮擦.
  2. 或者把这个函数做成模板函数,这样编译器就可以推断出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));
    }
    

3
投票

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文件的顶部。

© www.soinside.com 2019 - 2024. All rights reserved.