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

mutex_mapを警告すると、次のタイプのものであり生成します。私は、通常のCのために、次の警告を取得しています++次のコード

warning: extended initializer lists only available with -std=c++0x or -std=gnu++0x 
グローバルスコープで同じファイル内

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

私はこの警告を正確に理解できません&これを解決する方法

答えて

4

あなたのPTHREAD_MUTEX_INITIALIZERは、何らかの方法でイニシャライザリストと同等です。

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

お知らせ初期化子リスト:

は、C++ 03では、このような配列を初期化することができます。しかし、それを行うクラスはサポートされていません。

C++ 11で追加された文字はstd::initializer_list<T>なので、この構文も可能です。さらに簡単に、

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

をまたは::次の点を考慮しているため、C++ 11には、C++ 11ではなく、C++ 03上で動作します

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

は、ベクトルが持っていますイニシャライザのリスト引数を取るコンストラクタです。これを独自のクラスに含めることもできます。通常通り、後者は以下と等価であることに注意してください。

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_INITIALIZERを使用しての

pthread_mutex_init(&mutex_map[key], NULL); 

を呼び出す必要があります。

+0

良い提案ですが、C++でこれを使うのが常に良いです。次の警告が削除されました: "拡張初期化子リストはC++ 11でのみ利用可能です"。 –

関連する問題