2012-07-26 10 views

答えて

7

この場合、定数はコンパイル時の初期化用ですので、この場合はpthread_mutex_initを使用してください。これに代えて

+0

'static pthread_mutex_t'のみ? – Alcott

+0

その後、 'pthread_mutex_t'データメンバを初期化リストに入れることはできません。 – Alcott

+0

申し訳ありませんが、私は静的な初期化ではなく、コンパイル時の初期化を意味します。そして、はい、あなたは初期化リストに(少なくともC++ 11ではなく)それを置くことはできません。 –

10

A::A() 
{ 
    mu = PTHREAD_MUTEX_INITIALIZER; //cannot compile 
} 

これを試してください:

A::A() 
{ 
pthread_mutex_init(&(mu), NULL); 
} 

PTHREAD_MUTEX_INITIALIZERマクロ、{0,0,0,0,0 {0のようなもののためのC言語の構造体の初期化子であります}}}、定義のポイントでのみ使用できます。

2

我々は、それはまだ失敗コンストラクタで初期化リストを使用するように、これを変更しても:それは失敗し、唯一のを見て、いくつかの状況で初期化のために使用することが、なぜ

#include <pthread.h> 

struct foo { 
    pthread_mutex_t test; 
    foo() : test(PTHREAD_MUTEX_INITIALIZER) {} 
}; 

int main() { 
    foo f; 
} 

我々はを見ることができます前processsorからの出力:それはC++ 03でそのような初期化のために、ネストされた括弧を使用することが法的ではないのですが、何がおそらくもっと面白いC++ 11は、この構文と完全に合法的使用法を作ることである

struct foo { 
    pthread_mutex_t test; 
    foo() : test({ { 0, 0, 0, 0, 0, { 0 } } }) {} 
}; 

。元のコードで

我々はいくつかのより多くのものを参照することができます:あなたが割り当てていない初期化であることを示す何

A::A() 
{ 
    const pthread_mutex_t test = PTHREAD_MUTEX_INITIALIZER; // initialization - fine 
    mu = test; // assignment - fine 
    mu = PTHREAD_MUTEX_INITIALIZER; // assignment - C++11 only 
} 
+0

なぜ私のOPのコードをコンパイルできないのですか? – Alcott

+0

元のコードは合法です。C++ 11また、コンパイラでC++ 11のサポートが有効になっていない可能性があります。 – Flexo

+0

C + +のstdsが非常に多いので、私は混乱していると感じています。 – Alcott

関連する問題