将大括号括起来的初始值设定项列表转换为类型时出错的含义
Meaning of error converting brace enclosed initializer list to type?
我正在尝试移植/构建g++以在我的系统上运行,并在构建libstdc++时遇到以下错误:
.../gcc-4.6.2/i686-pc-linux-gnu/libstdc++-v3/include/mutex:226:50:错误:无法将"{0}"从"
<brace-enclosed initializer list>
"转换为"std::timed_mutex::__native_type {aka pthread_mutex_t}
">
include/mutex
中的相关代码是:
class timed_mutex
{
// ...
__native_type _M_mutex;
// ...
timed_mutex() : _M_mutex(__GTHREAD_MUTEX_INIT) { } // Line 226
// ...
}
__native_type
pthread_mutex_t
,__GTHREAD_MUTEX_INIT
扩展到{0}
。
我对C++一点也不熟悉,只是C,但我在这里看不出有什么明显的问题。错误是什么意思?
正确的语法是:
timed_mutex() : _M_mutex({__GTHREAD_MUTEX_INIT}) { } // i.e. _M_mutex({{0}})
但是,该功能仅适用于 C++11。演示。
对于较旧的编译器,不能将初始值设定项列表与构造函数一起使用。
具有 2 个{}
的原因是,pthread_mutex_t
是定义如此处所示的union
。它包含struct
、char[24]
、long int
;因此,初始化语法自然会有所不同。
更新:当我尝试在测试文件中编译<mutex>
标头时,它给出了以下错误:
/usr/include/c++/4.6/bits/c++0x_warning.h:32:2:错误:#error 这个 文件需要编译器和库支持即将推出的 ISO C++ 标准,C++0x。此支持目前处于试验阶段,必须 使用 -std=c++0x 或 -std=gnu++0x 编译器选项启用。
特定文件很可能遵循 C++11 的初始值设定项语法。
相关文章:
- 复制列表初始化的隐式转换的等级是多少
- 如何在不强制转换每个参数的情况下删除初始值设定项列表中从 int 到 char 的缩小转换?
- 为什么我会收到此错误?无法将 {lb, ub} 从<大括号括起来的初始值设定项列表>转换为 float(**)(float*, int)
- std::map, std::unordered_map - 缩小初始值设定项列表中的转换范围
- 无法从"初始值设定项列表"转换为模板<int>
- 将 lambda 函数转换为具有混合 lambda 引入器和参数列表的函子结构
- 传递可变参数时在成员初始值设定项列表中强制转换
- C++中有向无环图的邻接列表到邻接矩阵的转换
- C++列表初始化允许多个用户定义的转换
- 类型映射资源并将列表转换为矢量(并返回)
- 函数获取参数的变量列表并将它们转换为一系列字节?
- 从 std::vector<double> 到 Python 列表的转换失败(提升 python)
- 在初始值设定项列表中强制转换shared_ptr
- 将 std::list of structs 转换为 Python 列表
- 标准::列表转换和复制
- 如何在逗号分开列表中解析字段并将其转换为整数
- 错误 C2440:"正在初始化":无法从"初始值设定项列表"转换为"std::vector<char *,std::分配器<_Ty>>
- 如何将任何值转换为字节数组并将其附加到字节列表
- 解析SVG转换属性的转换列表
- 最好强制转换列表中的一个元素,或者使用指向它的指针