7

我有这个与线程一起工作的简单程序。在 Clang 中,我得到了一堆令人困惑的无关错误。这是程序:

#include <iostream>
#include <thread>
#include <future>

int main()
{
   std::packaged_task<int()> task([] { return 1; });
   std::future<int> result = task.get_future();

   task();

   std::cout << "Result was: " << result.get();
}

错误:

std::chrono::duration<long, std::ratio<1, 1000000> >错误:没有用于初始化“持续时间”(又名“ ”)的匹配构造函数:_d 'std::chrono::time_point<std::chrono::system_clock, std::chrono::duration<long, std::ratio<1, 1000000> > >::time_point<std::chrono::duration<long, std::ratio<1, 1000000000> > >' _t.time_since_epoch())注意:在此处请求的函数模板特化的实例化中

还有更多,但您可以在程序的这个链接中看到它。奇怪的是,它在 g++ 4.7.3 和 4.6.3 中编译得很好。为什么这只发生在 Clang 中?

更新:正如大卫指出的那样,当我包含<future>标题时,它似乎只是失败了。

4

3 回答 3

6

这是 clang/libstdc++ 中记录的错误。

http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=666539

http://llvm.org/bugs/show_bug.cgi?id=12893

从 Clang 的状态页面

Clang 的 C++11 模式可以与 libc++ 或 gcc 的 libstdc++ 一起使用,但需要补丁才能使 libstdc++-4.4 在 C++11 模式下与 Clang 一起使用。还需要补丁才能使 libstdc++-4.6 和 libstdc++-4.7 在 C++11 模式下与 3.2 版之前的 Clang 版本一起使用。

于 2013-04-01T16:44:36.803 回答
1

这是 libstdc++ 和 clang 之间的不兼容问题。如果您要针对 libstdc++ 4.8.0 进行构建,这个问题就会消失。

[11:43am][wlynch@apple /tmp] /opt/llvm/3.2/bin/clang++ -std=gnu++11 -gcc-toolchain /opt/gcc/4.8.0 se.cc |& wc -l
0
[11:43am][wlynch@apple /tmp] /opt/llvm/3.2/bin/clang++ -std=gnu++11 -gcc-toolchain /opt/gcc/4.7.2 se.cc |& wc -l
21
于 2013-04-01T16:43:20.287 回答
1

如果在 clang 3.2 中发生这种情况,则不是bug 12893(已在 clang 3.2 中修复)。

更有可能是这个错误,这实际上是 libstdc++ 4.7 中的一个错误:http ://gcc.gnu.org/bugzilla/show_bug.cgi?id=53841

于 2013-06-27T12:52:50.627 回答