【问题标题】:error: cannot convert ‘<lambda(double)>’ to ‘double (*)(double)’ [duplicate]错误:无法将“<lambda(double)>”转换为“double (*)(double)”[重复]
【发布时间】:2020-10-02 19:13:49
【问题描述】:

我有这个错误

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 声明为全局来捕获它时,它可以工作。但是当我在函数 g++ 的范围内声明 alea 时,会显示此错误。

您知道问题出在哪里以及如何通过将alea 保留在我的函数中来解决它吗?

【问题讨论】:

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


    【解决方案1】:

    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 &lt;functional&gt;

    【讨论】:

    • std::function 是一个相当重量级的选项。一般来说,它必须分配内存来保存函数对象。在这种情况下,捕获的对象是一个布尔值,将适合小缓冲区优化。但是,在这种情况下,我可能会选择模板。
    • @Paul Sanders 非常感谢。
    【解决方案2】:

    您只能转换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));
      }
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-20
      • 2020-06-22
      • 1970-01-01
      • 2015-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-23
      相关资源
      最近更新 更多