,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&()>”中没有类型命名类型

标签: c++

解决方案


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。


推荐阅读