将clang 3.1与初始化列表一起使用

时间:2012-06-12 11:59:57

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

编译此代码时:

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) {

有没有人知道修复,如果有的话?

提前致谢

2 个答案:

答案 0 :(得分:2)

你可能想写std::initializer_list<T>。确保包含<initializer_list>

答案 1 :(得分:2)

您的代码示例不完整。如果您能提供完整的示例,那将非常有用。编写代码的问题在于您缺少

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

...而initializer_list位于命名空间std中,因此您也错过了构造函数声明中的std::

但是,由于您声称这些都不是问题,最可能的原因似乎是您的C ++标准库实现不提供std::initializer_list。如果Clang正在使用GCC的libstdc ++,并且您没有安装适当的新版本,那么就是这种情况:您至少需要4.4版本,但请注意修复libstdc ++中的错误需要a patch - 4.4 in为了使它在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

因此,您错过了问题中的第一个诊断,或问题是您已声明了一些名为template其他(非initializer_list)类型在您的问题中省略的代码中,隐藏std::initializer_list。如果没有看到代码的其余部分或其他诊断信息,就无法确定哪一个。