为什么我的 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 您显示的代码片段中未知的内容。
我的 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 您显示的代码片段中未知的内容。