将 clang 3.1 与初始值设定项列表一起使用
Using clang 3.1 with initializer lists
当我编译这段代码时:
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
。如果不查看其余代码或诊断的其余部分,就无法分辨出是哪个。
相关文章:
- 当返回语句时,逗号运算符、大括号初始化列表和 std::unique_ptr 组合在一起
- 与引用一起使用的列表,在用作成员时更改行为
- 与lambda一起使用虚拟继承在初始化列表中捕获此问题的GCC错误
- 将[]运算符与链接列表一起使用
- 当将 getline 与 int 一起使用时,如何修复"没有重载函数 'getline' 的实例与参数列表匹配"
- 如何将重新绑定与自定义分配器和自定义列表一起使用
- 如何将 2 个链表合并或合并在一起以创建新列表
- 常量变量初始化仅与成员初始化列表一起工作
- 将initalizer列表与从空基类继承的结构一起使用
- 具有与专用列表一起使用的参数列表的超类方法<superclass>
- 为什么 auto 关键字不能与指向函数的指针的初始化列表一起使用?
- 如何将列表语法与默认精神一起使用
- 使初始化列表与 C++ 中的继承一起使用
- 将 clang 3.1 与初始值设定项列表一起使用
- 将BOOST_FOREACH与恒定的侵入性列表一起使用
- 如何将 auto 与初始值设定项列表一起使用push_back
- 如何使用与成员初始化器列表一起使用的static_assert
- boost DFS不能与set垂直列表一起工作
- STL算法可以与循环列表一起使用吗?
- 将字符串的填充构造函数与初始值设定项列表一起使用