为什么我的 std::function 没有可行的转换?

Why does my std::function have no viable conversion?

我的 Compressor class 有字段 QMap<QString, std::function<DataList(Compressor&, DataList &)> &> *techniques; 和静态方法 static DataList & sndStep(DataList &l);。它们的类型定义:

typedef QPair<QPointF, QString> Data;
typedef QList<Data> DataList;
typedef QList<DataList> DataTable;

我正在尝试创建一个 QMap,它将包含 QString 技术名称作为键和技术名称作为值。

起初,我尝试插入对 ("R0", sndStep){

Compressor::Compressor(const QString& s)
{
  std::function<DataList(Compressor&, Datalist&)> f =  
      [] (DataList & l) {
          return &Compressor::sndStep(DataList & l);
       };

  techniques->insert("R0", f);
}

但是我遇到了很多错误。其中之一是“没有可行的转换”:

compressor.cpp:8:53: error: no viable conversion from '(lambda at C:\Qt\Projects\ChartWithMenu\compressor.cpp:9:9)' to 'std::function<DataList (Compressor &, DataList &)>' (aka 'function<QList<QPair<QPointF, QString>> (Compressor &, QList<QPair<QPointF, QString>> &)>')
std_function.h:402:7: note: candidate constructor not viable: no known conversion from '(lambda at C:\Qt\Projects\ChartWithMenu\compressor.cpp:9:9)' to 'std::nullptr_t' (aka 'nullptr_t') for 1st argument
std_function.h:413:7: note: candidate constructor not viable: no known conversion from '(lambda at C:\Qt\Projects\ChartWithMenu\compressor.cpp:9:9)' to 'const std::function<QList<QPair<QPointF, QString>> (Compressor &, QList<QPair<QPointF, QString>> &)> &' for 1st argument
std_function.h:422:7: note: candidate constructor not viable: no known conversion from '(lambda at C:\Qt\Projects\ChartWithMenu\compressor.cpp:9:9)' to 'std::function<QList<QPair<QPointF, QString>> (Compressor &, QList<QPair<QPointF, QString>> &)> &&' for 1st argument
std_function.h:446:2: note: candidate template ignored: substitution failure [with _Functor = (lambda at C:\Qt\Projects\ChartWithMenu\compressor.cpp:9:9),  = void]: no type named 'type' in 'std::result_of<(lambda at C:\Qt\Projects\ChartWithMenu\compressor.cpp:9:9) &(Compressor &, QList<QPair<QPointF, QString>> &)>'
compressor.cpp:9:9: note: candidate function

我该如何解决这个错误?或者是否有其他方法可以创建函数映射(不一定 std::function)?

这里你要定义 f 为一个接受两个参数 (Compressor&, Datalist&) 并返回 DataList:

的函数
std::function<DataList(Compressor&, Datalist&)> f

但这不是 lambda 的签名:

    [] (DataList & l) {
        return &Compressor::sndStep(DataList & l);
    };

它只接受一个参数 (DataList&) 和 returns 您显示的代码片段中未知的内容。