c++ - 在模板中,“std::result_of”中没有名为 type 的类型"
问题描述
我是 C++ 编程的新手,我很困惑为什么我不能提供我的模板参数来初始化 cpp 中的 packaged_task。
#include <vector>
#include <queue>
#include <chrono>
#include <thread>
#include <cassert>
#include <future>
using namespace std::chrono;
using std::future;
using std::packaged_task;
using std::priority_queue;
class CPlayGround {
priority_queue<int> pq;
public:
CPlayGround() {
using task_type = int();
packaged_task<task_type> pt{aFunc()};
}
int aFunc() {
return 10;
}
};
我的 CLion 编译器状态:
在模板中,“std::result_of<int&()>”中没有类型命名类型
解决方案
packaged_task
包装一个可调用对象,如果传递aFunc()
,则传递调用的结果,即 an int
,在您的情况下,它与编写相同:
packaged_task<task_type> pt{10}; // does not make much sense, right?
如果aFunc
是自由函数(不是成员函数),您可以将其地址传递给packaged_task
构造函数:
packaged_task<task_type> pt{&aFunc};
但由于它是一个成员函数,最简单的方法1是将调用包装在 lambda 中:
packaged_task<task_type> pt{[this] { return aFunc(); }};
如果您不熟悉语法,[this] { return aFunc(); }
那么它是一个 lambda,它捕获this
,不带参数(()
对于 lambda 是可选的),并且它的主体是指定的(我们可以访问成员函数aFunc()
,因为this
被捕获)。
1还有其他方法,例如std::bind
,但在大多数情况下我会推荐使用捕获 lambda。
推荐阅读
- javascript - 扫雷艇发现空白方块
- javascript - 为数组对象分配值,然后将该值乘以匹配对象的计数
- php - wordpress https登录重定向到woocommerce帐户
- excel - 在另一个工作表中搜索单元格的值,为其着色并重复
- typescript - 在 TypeScript 中将变量定义为可区分联合的一种变体
- c# - Xamarin 表单中 ListView 的行为中缺少某些内容
- ms-access - MS Access(开关功能)
- assembly - 尔湾 x86 汇编输出
- java - Java 十六进制 velue 转换为 ascii 并返回十六进制出错
- java - 使用 java 处理 wsdl 模式中的“任何”字段