错误转换括号括起初始化列表到类型的含义?

时间:2012-03-01 03:23:36

标签: c++ initialization

我正在尝试移植/构建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_typepthread_mutex_t__GTHREAD_MUTEX_INIT扩展为{0}

我对C ++一点都不熟悉,只是C,但我在这里看不到任何明显的错误。错误是什么意思?

1 个答案:

答案 0 :(得分:2)

正确的语法是:

timed_mutex() : _M_mutex({__GTHREAD_MUTEX_INIT}) { }  // i.e. _M_mutex({{0}})

但是,该功能仅适用于 C ++ 11 Demo
对于较旧的编译器,不能将初始化列表与构造函数一起使用。

拥有2 {}的原因是,pthread_mutex_tunion,定义为shown here。其中包含structchar[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的初始化语法