C ++-期货向量

时间:2019-02-07 03:42:14

标签: c++ future

以下代码无法编译:

#include <iostream>
#include <future>
#include <vector>

class Calculator {
public:
    static int add(int a, int b)
    {
        return a + b;
    }
};

int main(int argc, char* argv[]) {
    std::vector<std::future<int>*> futures;

    for(auto i = 0; i < 4; i++) {
        auto future = new std::async(&Calculator::add, 1, 3);
        futures.push_back(future);
    }

    for(auto i = 0; i < 4; i++) {
        std::cout << futures[i]->get() << std::endl;
        delete futures[i];
    }

    return 0;
}

我收到以下错误:

error: no type named 'async' in namespace 'std'

如何在期货向量上存储和调用get()?

更新:

我正在使用C ++ 11,并且没有矢量逻辑的异步示例也可以正常工作。

1 个答案:

答案 0 :(得分:4)

深深地怀疑使用裸露的newdelete调用的任何代码(顺便说一下,这是一种良好的开发态度),我改写为使用更“现代”的代码'C ++习惯用法。

我不是完全确定,为什么您认为需要将指针存储到期货中,这似乎使事情变得不必要了。无论如何,摘要new std::async()导致g++出现问题,我相信这是导致您的错误no type named 'async' in namespace 'std'的原因。

从技术上讲,这是正确的,async中没有 type std,因为async函数而不是一种类型。

修改后的代码如下:

#include <iostream>
#include <future>
#include <vector>

class Calculator {
public:
    static int add(int a, int b) { return a + b; }
};

int main() {
    std::vector<std::future<int>> futures;
    for(auto i = 0; i < 4; i++)
        futures.push_back(std::async(&Calculator::add, i, 3));
    for(auto i = 0; i < 4; i++)
        std::cout << futures[i].get() << std::endl;
    return 0;
}

这可以编译并正常运行,给出我期望看到的结果:

pax> g++ -Wall -Wextra -pthread -std=c++11 -o testprog testprog.cpp
pax> ./testprog
3
4
5
6