以下代码无法编译:
#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,并且没有矢量逻辑的异步示例也可以正常工作。
答案 0 :(得分:4)
深深地怀疑使用裸露的new
或delete
调用的任何代码(顺便说一下,这是一种良好的开发态度),我改写为使用更“现代”的代码'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