C++20 <chrono> 嵌套名称说明符中使用的不完整类型

Seb*_*rek 5 c++ gcc libstdc++ c++-chrono c++20

现在,支持新日历和时区功能的GCC 11已发布,我正在尝试在我的代码中使用这些功能。

\n

使用以下最小示例:

\n
#include <chrono>\n#include <iostream>\n\nint main()\n{\n    using namespace std;\n\n    cout << chrono::utc_clock::now() << endl;\n\n    return EXIT_SUCCESS;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

使用以下内容编译:

\n
> /usr/local/gcc-11.1.0/bin/g++-11.1 -std=c++-20 main.cpp\n
Run Code Online (Sandbox Code Playgroud)\n

给出以下错误:

\n
main.cpp: In function \xe2\x80\x98int main()\xe2\x80\x99:\nmain.cpp:8:36: error: incomplete type \xe2\x80\x98std::chrono::utc_clock\xe2\x80\x99 used in \n    nested name specifier\n    8 |         cout << chrono::utc_clock::now() << endl;\n      | \n
Run Code Online (Sandbox Code Playgroud)\n

我调查了这个错误,它似乎通常源于前向声明。有谁知道为什么会发生这种情况?

\n

我还尝试显式链接新建的 GCC 11 版本的 libstdc++.a:

\n
/usr/local/gcc-11.1.0/bin/g++-11.1 -std=c++20 -L/usr/local/gcc-11.1.0/lib -lstdc++ main.cpp\n
Run Code Online (Sandbox Code Playgroud)\n

但我收到同样的错误消息。

\n

一些额外信息:

\n
> /usr/local/gcc-11.1.0/bin/g++-11.1 --version\n
Run Code Online (Sandbox Code Playgroud)\n

给出以下输出:

\n
g++-11.1 (GCC) 12.0.0 20210427 (experimental)\nCopyright (C) 2021 Free Software Foundation, Inc.\nThis is free software; see the source for copying conditions.  There is NO\nwarranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n
Run Code Online (Sandbox Code Playgroud)\n

这对我来说是出乎意料的,因为我期待看到 11.1。我在 MacOS 上构建了这个,我的clang++版本是 12.0.5。这是预期的吗?这可能是问题的潜在根源吗?

\n

此外,该网站显示了编译器对 C++20 标准库功能的支持,表明 GCC 11对更新chrono.

\n

最后,我使用该视频作为参考从源代码构建了 GCC 11。

\n

How*_*ant 4

目前 gcc 中仅支持部分 C++20 chrono。 这是 libstdc++ 源代码关于此事的当前状态。 这显示了 的简单前向声明utc_clock,并且没有定义,这与您看到的错误消息一致。

发现对 的支持越来越多,包括用于在和file_clock之间进行转换的低级 API 。这是一个重要的补充。file_clock::time_pointsystem_clock::time_point

此外,我看到C++20 中对日历类型的支持(例如year_month_day等),这就是发行说明所指的内容。