C++ 错误:无法转换‘&书信电报;兰姆达(双)>’;至‘;双(*)(双)和#x2019;

C++ 错误:无法转换‘&书信电报;兰姆达(双)>’;至‘;双(*)(双)和#x2019;,c++,c++11,lambda,function-pointers,member-functions,C++,C++11,Lambda,Function Pointers,Member Functions,我有这个错误 error: cannot convert ‘<lambda(double)>’ to ‘double (*)(double)’ 例如,当我没有通过声明alea是全局的来捕获它时,它就起作用了。但是当我在函数g++的作用域中声明alea时,会显示此错误 你知道问题出在哪里吗?我如何通过让我的函数保持alea本地来解决问题?std::function专门用于处理捕获的lambda。因此,替换这个: void Matrice::mapEmplace(double (*fc

我有这个错误

error: cannot convert ‘<lambda(double)>’ to ‘double (*)(double)’
例如,当我没有通过声明alea是全局的来捕获它时,它就起作用了。但是当我在函数g++的作用域中声明
alea
时,会显示此错误


你知道问题出在哪里吗?我如何通过让我的函数保持
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矩阵::映射模板(双(*fct)(双)){
对于(size_t i=1;i您只能转换。在您的情况下,lambda通过复制捕获
alea
,因此无法转换为函数指针类型

您有两个选择:

  • 或者使用一些
  • 或者将函数作为模板,以便编译器可以推断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));
    }
    
    模板
    无效矩阵::映射模板(T fct)
    {
    
    for(size_t i=1;i
    std::function
    是一个相当重的选项。一般来说,它必须分配内存来保存函数对象。在这种情况下,捕获的对象是一个布尔对象,将适合小缓冲区优化。但是,在这种情况下,我可能会选择模板。@Paul Sanders它工作得非常好,谢谢。
    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));
    }
    
    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));
    }