首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么不能在unique_ptr中使用QFuture?

为什么不能在unique_ptr中使用QFuture?
EN

Stack Overflow用户
提问于 2022-02-25 04:22:33
回答 1查看 76关注 0票数 0

下面是我的示例代码,我使用std::vector<std::unique_ptr<std::string>>作为未来的结果。

代码语言:javascript
复制
#include "mainwindow.h"
#include <QLineEdit>
#include <QtConcurrent/QtConcurrent>
#include <vector>

MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent) {
    auto model = new QLineEdit(this);
    this->setCentralWidget(model);

    auto watcher = new QFutureWatcher<std::vector<std::unique_ptr<std::string>>>(/*this*/);
    auto future  = QtConcurrent::run([this]() -> std::vector<std::unique_ptr<std::string>> {
        std::vector<std::unique_ptr<std::string>> res;
        for (int k = 0; k < 100; ++k) {
            auto str = std::make_unique<std::string>("Hi");
            res.push_back(std::move(str));
        }
        return res;
    });

    connect(watcher, &QFutureWatcher<std::vector<std::unique_ptr<std::string>>>::finished, this, [=]() {
        for (const auto &item : future.result()){
            model->setText(model->text() + QString::fromStdString(*item));
        }
        delete watcher;
    });
    watcher->setFuture(future);
}

MainWindow::~MainWindow() {

}

但这段代码不能编译。这是原木,

代码语言:javascript
复制
/Users/ii/QT/qt-everywhere-src-6.2.0-beta4/include/QtCore/qfuture.h:328:12: note: in instantiation of member function 'std::vector<std::unique_ptr<std::string>>::vector' requested here
    return d.resultReference(0);
           ^
/Users/ii/CLionProjects/simpleQT/mainwindow.cpp:22:40: note: in instantiation of function template specialization 'QFuture<std::vector<std::unique_ptr<std::string>>>::result<std::vector<std::unique_ptr<std::string>>, void>' requested here
        for (const auto &item : future.result()){
                                       ^
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.1.sdk/usr/include/c++/v1/__memory/base.h:103:16: note: candidate template ignored: substitution failure [with _Tp = std::unique_ptr<std::string>, _Args = <std::unique_ptr<std::string> &>]: call to implicitly-deleted copy constructor of 'std::unique_ptr<std::string>'
constexpr _Tp* construct_at(_Tp* __location, _Args&& ...__args) {
               ^
EN

回答 1

Stack Overflow用户

发布于 2022-02-25 07:53:17

为了只使用移动类型,您需要使用takeResult而不是result

QFuture并不是真正考虑到可移动类型的设计,您最好使用可复制的类型或std::future

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71261018

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档