【问题标题】:Using clang 3.1 with initializer lists将 clang 3.1 与初始化列表一起使用
【发布时间】:2012-06-12 11:59:56
【问题描述】:

当我编译这段代码时:

template<typename T>
struct S {
  std::vector<T> v;
  S(initializer_list<T> l) : v(l) {
    std::cout << "constructed with a " << l.size() << "-element list\n";
  }
};

使用以下命令行:

 clang++ -std=c++11 -stdlib=libc++ initializer_list.cpp

我收到以下错误。

initializer_list.cpp:12:23: error: expected ')'
    S(initializer_list<T> l) : v(l) {

有没有人知道解决办法??

提前致谢

【问题讨论】:

  • 是的。它来自那个例子。
  • 请不要使用 HTML 手动格式化您的代码。请参阅the editing help 了解如何在此处格式化代码。这次我为你做了。
  • 我最终安装了 g++ 4.7.0,它编译顺利,所以我想我必须等待 clang++ 更新。我已经等待 C++ 成为具有 c++11 的“现代”编程语言很长时间了。我想可以等待更长的时间让所有工具都能正常工作。然后是“概念”的更长一点

标签: c++ c++11 clang++


【解决方案1】:

您可能打算写std::initializer_list&lt;T&gt;。确保包含&lt;initializer_list&gt;

【讨论】:

  • 我确实包含了 并且无论是否带有 std:: 前缀,它都会给出相同的错误。
【解决方案2】:

您的代码示例不完整。如果你能提供一个完整的例子,那将会很有用。编写的代码的问题是您丢失了

#include <initializer_list>
#include <vector>
#include <iostream>

...而initializer_list 在命名空间std 中,因此您的构造函数声明中也缺少std::

但是,由于您声称这些都不是问题,因此最可能的原因似乎是您的 C++ 标准库实现未提供 std::initializer_list。如果 Clang 正在使用 GCC 的 libstdc++,并且您没有安装合适的新版本:您至少需要 4.4 版本,但请注意 a patch 需要修复 libstdc++-4.4 中的错误,以便让它在 C++11 模式下与 Clang 一起工作,否则你会得到关于 type_info 和其他各种问题的错误。

另外,你说你收到的诊断是这样的:

initializer_list.cpp:12:23: error: expected ')'
    S(initializer_list<T> l) : v(l) {
                      ^

(我已经根据提供的列号重建了插入符号;在以后的问题中保留它会很有用。)对于上述任何解释,这不会是 Clang 产生的第一个诊断;大概是这样的:

initializer_list.cpp:12:5: error: no template named 'initializer_list'; did you mean 'std::initializer_list'?
  S(initializer_list<T> l) : v(l) {
    ^~~~~~~~~~~~~~~~
    std::initializer_list

因此,要么您错过了问题的第一个诊断,要么问题是您在代码中声明了一些名为 initializer_listother(非template)类型你的问题中省略了,那就是隐藏std::initializer_list。如果不查看其余代码或其余诊断信息,则无法判断是哪一个。

【讨论】:

    猜你喜欢
    • 2021-10-01
    • 2013-05-15
    • 1970-01-01
    • 1970-01-01
    • 2018-09-17
    • 2018-04-20
    • 2014-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多