c++ - 错误 : cannot convert ‘<lambda(double)>’ to ‘double (*)(double)’

标签 c++ c++11 lambda function-pointers member-functions

<分区>

我有这个错误

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 保留在我的函数本地来解决它?

最佳答案

您只能转换the capture-less lambda to a c-style function pointer .在您的情况下,您的 lambda 通过复制捕获 alea,因此无法转换为函数指针类型。

你有两个选择:

  1. 要么使用 std::function与一些type-eraser overhead .
  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));
    }
    

关于c++ - 错误 : cannot convert ‘<lambda(double)>’ to ‘double (*)(double)’ ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62353259/

相关文章:

c++ - Execlp() 不接受参数列表,只接受命令。 UNIX/LINUX编程

c++ - 使用 fprintf 时的细微差别

c++ - QMessageBox 在关闭时删除

c++ - 为集合中的每个元素调用带有多个参数的函数

java - 将列表转换为 map

c++ - 从 std::stringstream 中提取位到 std::bitset

c++ - 没有 O(1) 操作来连接来自两个 forward_lists 的元素?

c++ - Variadic 可变模板模板参数

java - Log4j2 在方法引用调用中打印实用程序类行号

sql - 使用 Lambda 表达式以及 Join、GroupBy、Count 和 Sum 的 Linq to SQL