2012-05-05 2 views
4
mutex_map[key] = PTHREAD_MUTEX_INITIALIZER; 

mutex_map имеет следующий тип:После кода в конструктор генерирует предупреждение

static std::map<std::string, pthread_mutex_t> mutex_map; 

в том же файле в глобальном масштабе

я получаю следующее предупреждение для обычного C++

warning: extended initializer lists only available with -std=c++0x or -std=gnu++0x 

Я не в состоянии понять это предупреждение & как решить эту проблему

ответ

4

Ваш PTHREAD_MUTEX_INITIALIZER эквивалентен в некотором роде списку инициализаторов.

В C++ 03, вы можете инициализировать массив так:

int arr[5] = {1,2,3,4,5}; 

Обратите внимание на список инициализатор. Тем не менее, для классов нет поддержки.

В C++ 11 они добавили std::initializer_list<T>, поэтому этот синтаксис возможен. Рассмотрим следующий пример:

std::vector<int> v = {1,2,3,4,5}; 

Или еще проще:

std::vector<int> v{1,2,3,4,5}; 

Это будет работать на C++ 11, но не C++ 03, так как в C++ 11, вектор имеет конструктор, который принимает аргумент списка инициализатора. Вы можете включить это и в свои собственные классы. Обратите внимание, что последнее равносильно следующему, как обычно:

std::vector<int> v ({1,2,3,4,5}); 

Это помогает проиллюстрировать тот момент, что список инициализатора является фактическим типом в настоящее время.

Если вы хотите увидеть рекламный ролик Stroustrup, я указываю вам его C++11 FAQ.

+1

-1: Совершенно не имеет отношения к вопросу. Это системный заголовок ... – 6502

+0

@chris любые обходные пути? –

+0

@clickstefan, я не использую его, поэтому я не знаю, что именно представляет собой pthread_mutex_t', но он скорее всего просто имеет синтаксис списка инициализаторов как короткий путь и имеет долгий путь через других членов класса , – chris

2

Для дальнейшего решения работали: Вам необходимо позвонить

pthread_mutex_init(&mutex_map[key], NULL); 

вместо использования PTHREAD_MUTEX_INITIALIZER.

+0

Хорошее предложение, всегда лучше использовать это в C++. Было удалено следующее предупреждение: «Расширенные списки инициализаторов доступны только с C++ 11». –

Смежные вопросы