我正在尝试移植/构建g ++以在我的系统上运行,并在构建libstdc ++时遇到以下错误:
... / gcc-4.6.2 / i686-pc-linux-gnu / libstdc ++ - v3 / include / mutex:226:50:错误:无法从'
<brace-enclosed initializer list>
转换'{0}' '到'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,但我在这里看不到任何明显的错误。错误是什么意思?
答案 0 :(得分:2)
正确的语法是:
timed_mutex() : _M_mutex({__GTHREAD_MUTEX_INIT}) { } // i.e. _M_mutex({{0}})
但是,该功能仅适用于 C ++ 11 。 Demo。
对于较旧的编译器,不能将初始化列表与构造函数一起使用。
拥有2 {}
的原因是,pthread_mutex_t
是union
,定义为shown here。其中包含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的初始化语法。