gpt4 book ai didi

c++ - Qt C++ lambda 表达式不推导返回类型

转载 作者:搜寻专家 更新时间:2023-10-31 02:11:54 24 4
gpt4 key购买 nike

我有一个 lambda 表达式,它包装了另一个类的成员函数,因此我可以在其他类中使用它,就像它是它们自己的成员一样。

auto fun = [this] (const QString& imageName) -> QImage {
typedef QImage result_type;
return _mapper(imageName);
};

_mapper 仿函数来自另一个类并返回一个 QImage

现在我的问题是编译器或我正在使用它的 Qt 函数不喜欢这样,无法推断出结果类型。

QtConcurrent/qtconcurrentmapkernel.h:124: error: no type named ‘result_type’ in ‘struct *mystruct_ptr*::<lambda(const class QString&)>’
IntermediateResults<typename MapFunctor::result_type> results;
^

但是更传统的 std::bind 可以工作:

auto fun_binded = std::bind(&Mapper::operator(), &_mapper, std::placeholders::_1);

那么问题:lambda 有什么问题?

也许我应该提一下我使用它的上下文:

QtConcurrent::mappedReduced<QList<QImage>>(*image_container*, fun, fun_reduce))

fun_reduce 的实现方式类似,只是它有一个 void 函数。

最佳答案

问题是 lambda 没有定义库在 typename MapFunctor::result_type 中使用的成员类型 result_typestd::function 确实如此。

库需要定义 result_type

所以要么坚持 std::bind,要么将你的 lambda 包装在 std::function 中:

// This will convert the lambda to an std::function
std::function<QImage(const QString&)> fun =
[this](const QString& imageName) { return _mapper(imageName);};

或者编写一个定义了这种类型的自定义结构。

struct MyFunctor
{
using result_type = QImage;

// Here you must store a pointer or a ref to the "owner" (this)

QImage operator()(const QString& imageName) {
return owner->mapper(imageName);
}
};

关于c++ - Qt C++ lambda 表达式不推导返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42879284/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com