我遇到了g ++编译器的问题。在我的工作机器上(运行OS X 10.10.4)我正在使用Xcode试验一些代码。代码确实成功编译,生成的可执行文件按预期工作。输出clang++ --version
:
Apple LLVM版本6.1.0(clang-602.0.53)(基于 LLVM 3.6.0svn)目标:x86_64-apple-darwin14.4.0线程模型:posix
然后我决定在使用g ++运行Debian 8的服务器上编译此代码。 g++ --version
的输出:
g ++(Debian 4.9.2-22)4.9.2版权所有(C)2014自由软件 Foundation,Inc。
代码甚至不会使用g ++进行编译。我尝试使用的命令:g++ -std=c++11 -pthread main.cpp
我收到以下错误消息:
main.cpp:在函数'int main()'中:
main.cpp:32:106:错误:无效使用不完整类型'class std :: packaged_task' std :: shared_ptr> ptr(new std :: packaged_task(std :: bind(factorial,6)));
main.cpp中包含的文件:11:0:
/ usr / include / c ++ / 4.9 / future:120:11:错误:'class std :: packaged_task'的声明 class packaged_task; ^
main.cpp:33:22:错误:变量'std :: future fu1'有初始值但不完整的类型 std :: future fu1 = ptr-> get_future(); ^
main.cpp:33:31:错误:无效使用不完整类型'class std :: packaged_task' std :: future fu1 = ptr-> get_future(); ^
main.cpp中包含的文件:11:0:
/ usr / include / c ++ / 4.9 / future:120:11:错误:'class std :: packaged_task'的声明 class packaged_task; ^
main.cpp:在lambda函数中:
main.cpp:34:48:错误:无效使用不完整类型'class std :: packaged_task' std :: function task1 =& ptr {ptr-> operator()(); }; ^
main.cpp中包含的文件:11:0:
/ usr / include / c ++ / 4.9 / future:120:11:错误:'class std :: packaged_task'的声明 class packaged_task; ^
main.cpp:在函数'int main()'中:
main.cpp:36:38:错误:变量'std :: packaged_task t'有初始化程序但是类型不完整 std :: packaged_task t(std :: bind(factorial,5)); ^
main.cpp:37:22:错误:变量'std :: future fu2'有初始值但不完整的类型 std :: future fu2 = t.get_future(); ^
我的代码:
#include <iostream>
#include <thread>
#include <future>
#include <memory>
using std::cout;
using std::cin;
using std::endl;
unsigned long long int factorial(unsigned long long int num)
{
unsigned long long int N = num;
for (unsigned long long int i = num; i > 1; --i)
{
num *=(--N);
}
return num;
}
int main()
{
std::shared_ptr<std::packaged_task<int()> > ptr(new std::packaged_task<int()>(std::bind(factorial, 6)));
std::future<int> fu1 = ptr->get_future();
std::function<void()> task1 = [&ptr](){ ptr->operator()(); };
std::packaged_task<int()> t(std::bind(factorial, 5));
std::future<int> fu2 = t.get_future();
std::function<void()> task2 = [&t](){ t(); };
std::thread threads[2];
threads[0] = std::thread(task1);
threads[1] = std::thread(task2);
cout << fu1.get() << endl;
cout << fu2.get() << endl;
threads[0].join();
threads[1].join();
return 0;
}
g ++会出现什么问题?
答案 0 :(得分:1)
看来std::future
&amp;由于某种原因,armel架构上没有实现std::async
。
我无法真正找到原因(有些人认为邮件列表,他们没有通过设计实现,有些人说这是一个错误)以及问题的当前状态是什么。
但是,我还发现一条回复说明可能已在libstdc++
的较新版本中得到解决(我的系统正在运行debian的测试版,我不知道有这些版本,我不打算从不稳定的回购中获取包,所以我只是等待它。)