【问题标题】:clang 4 build error on <functional> with c++1z使用c ++ 1z在<功能>上生成clang 4错误
【发布时间】:2017-05-30 12:25:45
【问题描述】:

我刚刚将我的 arch linux 系统更新到了最新版本,其中包括 gcc 7.1.1。尝试构建这个:

#include <functional>

int main(int argc, char** argv) {
    return 1;
}

使用命令

clang++ main.cpp -std=c++1z

导致错误:

In file included from main.cpp:1:
In file included from /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/7.1.1/../../../../include/c++/7.1.1/functional:60:
In file included from /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/7.1.1/../../../../include/c++/7.1.1/unordered_map:47:
In file included from /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/7.1.1/../../../../include/c++/7.1.1/bits/hashtable.h:37:
In file included from /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/7.1.1/../../../../include/c++/7.1.1/bits/node_handle.h:39:
/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/7.1.1/../../../../include/c++/7.1.1/optional:1032:27: error: use of class template 'optional'
      requires template arguments
  template <typename _Tp> optional(_Tp) -> optional<_Tp>;
                          ^
/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/7.1.1/../../../../include/c++/7.1.1/optional:451:11: note: template is declared here
    class optional
          ^
/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/7.1.1/../../../../include/c++/7.1.1/optional:1032:40: error: expected ';' at end of declaration
  template <typename _Tp> optional(_Tp) -> optional<_Tp>;
                                       ^
/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/7.1.1/../../../../include/c++/7.1.1/optional:1032:41: error: cannot use arrow operator on a type
  template <typename _Tp> optional(_Tp) -> optional<_Tp>;

这是我的错误,arch linux 还是 clang?

更新:(忘记添加版本)

  • gcc 包版本 7.1.1-2(提供 /usr/include/c++ 目录)
  • clang 包版本 4.0.0-3

【问题讨论】:

  • 看来clang还不支持推导指南。
  • 啊,我没有意识到这就是这里发生的事情(并且忘记了这是 c++17 的一个特性)。谢谢!
  • 这里有同样的错误。您是否找到任何解决方法?我发现的唯一一个是切换到 g++ ..
  • 没有clang的解决方法。正如巴里所说;它只是尚未实施。就我而言,这只是一个 buildbot 问题,因为无论如何我的大部分工作都使用 g++,但 clang 测试构建仍然失败。
  • 好的。那就等着吧……

标签: c++ archlinux clang++ c++17


【解决方案1】:

有点晚了,但我想总结一下。

这个:

template <typename _Tp> optional(_Tp) -> optional<_Tp>;

是演绎指南的例子。 Here你可以找到这个语言特性的很好的解释。

新版本的 libstdc++ 在使用 -std=c++17 或 c++1z 标志时在其实现中使用它。 不幸的是,Clang 还不支持这个功能。 Clang C++1z status page 报告它仅在 SVN 上可用。

您可以找到 Arch Linux here 的错误报告。

【讨论】:

    猜你喜欢
    • 2018-04-22
    • 1970-01-01
    • 1970-01-01
    • 2012-05-11
    • 1970-01-01
    • 1970-01-01
    • 2017-11-03
    • 1970-01-01
    相关资源
    最近更新 更多