将 clang 3.1 与初始值设定项列表一起使用

Using clang 3.1 with initializer lists

本文关键字:列表 一起 clang      更新时间:2023-10-16

当我编译这段代码时:

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

使用以下命令行:

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

我收到以下错误。

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

有谁知道修复程序(如果有的话)?

提前致谢

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

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

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

。并且initializer_list在命名空间std中,因此您还缺少构造函数声明中的std::

但是,由于您声称这些都不是问题,因此最可能的原因似乎是您的C++标准库实现不提供std::initializer_list。如果 Clang 使用的是 GCC 的 libstdc++,并且您没有安装合适的新版本,则会出现这种情况:您至少需要 4.4 版,但请注意,需要补丁来修复 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_list 的其他(非template)类型,这隐藏了std::initializer_list。如果不查看其余代码或诊断的其余部分,就无法分辨出是哪个。