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
你可以看到错误。
解决方案
中的参数std::async
作为临时副本(右值)传递。您不能将右值分配给引用。要解决您的问题,您可以使用 const ref 或 copy
bool LevelClimberCompare(const CompareArgs &args)
或者
bool LevelClimberCompare(CompareArgs args)
您可以使用std::ref
或std::cref
传递参考
std::async(std::launch::async, &diffpng::LevelClimberCompare, std::ref(a))
推荐阅读
- c# - 在 C# 中克隆 VSTS 构建定义
- azure-ad-b2c - 如何使用 OpenID Connect(预览版)从原始 IdP 中捕获用户 identityId
- python - 如何加快数组元素的总和?
- java - 我想制作一个程序来识别英雄联盟客户端中的按钮
- c++ - 如何用空格填充字符串达到一定限制?
- mongodb - 如何在 CollectionType 中的表单事件中获取数据?
- c++ - 不能包括
使用 nixos 派生的标头 - php - Symfony 4“连接被拒绝”,同时尝试连接到 docker mysql 容器
- excel - 将excel中的特定单元格添加到电子邮件正文VBA excel
- javascript - 为什么这些报价在那里,我该如何删除它们?