Значение ошибки при преобразовании заключенного в скобки списка инициализатора в тип? - PullRequest
3 голосов
/ 01 марта 2012

Я пытаюсь портировать / собрать 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, но я не вижу здесь ничего явно неправильного.Что означает ошибка?

1 Ответ

2 голосов
/ 01 марта 2012

Правильный синтаксис:

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 This Файл требует поддержки компилятора и библиотеки для предстоящего ISO C ++ стандарт, C ++ 0x. Эта поддержка в настоящее время является экспериментальной и должна быть включен с опциями компилятора -std = c ++ 0x или -std = gnu ++ 0x .

Вполне возможно, что конкретный файл следует синтаксису инициализатора в C ++ 11.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...