',c++"/>

首页 > 解决方案 > 错误:'class std::result_of 中没有名为'type'的类型'

问题描述

我的代码是这样的:

    std::vector<bool> LevelClimberCompareMulti(std::vector<CompareArgs> &args) {
    std::vector<bool> ret(args.size());
    std::vector<std::shared_future<bool>> fts(args.size());
    //using ArgIter = std::vector<CompareArgs>::iterator;
    //using FtIter = std::vector<std::shared_future<bool>>::iterator;
    std::transform(args.begin(), args.end(), fts.begin(),
            [](CompareArgs& a) -> std::shared_future<bool> {return std::async(std::launch::async, &diffpng::LevelClimberCompare, a).share();});
    std::transform(fts.begin(), fts.end(), ret.begin(),
            [](std::shared_future<bool> ft) -> bool {return ft.get();});
    return ret;
}

例子:

#include <assert.h>
#include <cstdlib>
#include <cassert>
#include <cmath>
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include <algorithm>
#include <chrono>
#include <iostream>
#include <future>
#include <mutex>

using CompareArgs = int;

namespace diffpng {
    bool LevelClimberCompare(CompareArgs &args) {
        return true;
    }

    std::vector<bool> LevelClimberCompareMulti(std::vector<CompareArgs> &args) {
        std::vector<bool> ret(args.size());
        std::vector<std::shared_future<bool>> fts(args.size());
        //using ArgIter = std::vector<CompareArgs>::iterator;
        //using FtIter = std::vector<std::shared_future<bool>>::iterator;
        std::transform(args.begin(), args.end(), fts.begin(),
                [](CompareArgs& a) -> std::shared_future<bool> {return std::async(std::launch::async, &diffpng::LevelClimberCompare, a).share();});
        std::transform(fts.begin(), fts.end(), ret.begin(),
                [](std::shared_future<bool> ft) -> bool {return ft.get();});
        return ret;
    }
};

int main(int argc, char** argv) {
    std::vector<CompareArgs> args{1, 2, 3, 4, 5};
    auto res = diffpng::LevelClimberCompareMulti(args);
    for (int i = 0; i < res.size(); ++i) {
        std::cout << "res[" << i << "]: " << res[i] << std::endl;
    }
    return 0;
}

我得到这样的错误:我想知道这个错误是关于什么的,我该如何解决它?顺便说一句,我目前在 Win10 WSL ubuntu shell 上运行它,但我认为这与这里的错误无关。gcc 版本:

gcc (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

简单地用 cmd 编译它:g++ -std=c++14 example.cpp你可以看到错误。

在此处输入图像描述

标签: c++

解决方案


中的参数std::async作为临时副本(右值)传递。您不能将右值分配给引用。要解决您的问题,您可以使用 const ref 或 copy

bool LevelClimberCompare(const CompareArgs &args)

或者

bool LevelClimberCompare(CompareArgs args)

您可以使用std::refstd::cref传递参考

std::async(std::launch::async, &diffpng::LevelClimberCompare, std::ref(a))

推荐阅读