gpt4 book ai didi

c++ - 关于 std::future 的编译错误

转载 作者:行者123 更新时间:2023-11-28 02:58:52 25 4
gpt4 key购买 nike

代码如下:

#include <iostream>
#include <future>
#include <thread>
#include <unistd.h>

int foo(int n) {
n = n*1000;
sleep(1);
return n;
}

int main(void) {
std::packaged_task<int (int)> task(std::bind(foo, 3));
std::future<int> f(task.get_future());

std::thread trd(std::move(task));
std::cout << f.get() << std::endl;

return 0;
}

海湾合作委员会报告:

In file included from /usr/include/c++/4.8.2/future:38:0,
from a.cpp:2:
/usr/include/c++/4.8.2/functional: In instantiation of ‘struct std::_Bind_simple<std::packaged_task<int(int)>()>’:
/usr/include/c++/4.8.2/thread:137:47: required from ‘std::thread::thread(_Callable&&, _Args&& ...) [with _Callable = std::packaged_task<int(int)>; _Args = {}]’
a.cpp:16:33: required from here
/usr/include/c++/4.8.2/functional:1697:61: error: no type named ‘type’ in ‘class std::result_of<std::packaged_task<int(int)>()>’
typedef typename result_of<_Callable(_Args...)>::type result_type;
^
/usr/include/c++/4.8.2/functional:1727:9: error: no type named ‘type’ in ‘class std::result_of<std::packaged_task<int(int)>()>’
_M_invoke(_Index_tuple<_Indices...>)
^
make: *** [a] Error 1

我的 gcc 版本是 4.8.2 在 fedora 20 上

最佳答案

函数foo声明为:

int foo(int);

它的函数类型是int(int) (采用参数 int 并返回 int )。

但是,std::bind 返回的结果 callable当你绑定(bind) 3第一个参数具有不同的函数类型:int() ,例如:

auto func = std::bind(foo, 3) // Bind 3 to the first parameter.
func(); // Calling func requires no parameter.

解决方案

声明 std::packaged_task 时指定的模板参数应指定为 int() ,例如:

std::packaged_task<int()> task{std::bind(foo, 3)};

或者不要将参数绑定(bind)到3在构建 std::packaged_task 时,而是在创建 std::thread 时直接提供它对象:

std::packaged_task<int(int)> task{foo}; // Don't bind 3
auto f = task.get_future();

std::thread trd{std::move(task), 3}; // Supply 3 here instead.
std::cout << f.get() << std::endl;

此外

  • 确保调用 trd.join()从函数返回之前 main .
  • 使用 std::thread 时还可以使用标准库 中的 sleep 函数,而不是不可移植的 sleep ,例如:

    std::this_thread::sleep_for(std::chrono::seconds(1));
  • 同样在使用 std::move 时你应该包括标题 <utility>以防其他 header 不包含它。

关于c++ - 关于 std::future 的编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21375991/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com