2

当我编译这段代码时:

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

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

提前致谢

4

2 回答 2

3

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

于 2012-06-12T12:06:41.457 回答
2

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

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

...并且initializer_list在 namespace 中std,因此您的构造函数声明中也缺少 a 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

因此,要么您错过了问题的第一个诊断,要么问题是您已经声明了在您的问题中省略的代码中命名的其他(非)类型,那就是 hide 。如果不查看其余代码或其余诊断信息,则无法判断是哪一个。templateinitializer_liststd::initializer_list

于 2012-09-15T07:25:41.893 回答