class A {
public:
A();
private:
pthread_mutex_t mu;
};
A::A()
{
mu = PTHREAD_MUTEX_INITIALIZER; //cannot compile
}
pthread_mutex_t
をクラスメンバー関数内で初期化できませんか?C++メンバー関数内のPTHREAD_MUTEX_INITIALIZERをコンパイルできません。
class A {
public:
A();
private:
pthread_mutex_t mu;
};
A::A()
{
mu = PTHREAD_MUTEX_INITIALIZER; //cannot compile
}
pthread_mutex_t
をクラスメンバー関数内で初期化できませんか?C++メンバー関数内のPTHREAD_MUTEX_INITIALIZERをコンパイルできません。
この場合、定数はコンパイル時の初期化用ですので、この場合はpthread_mutex_init
を使用してください。これに代えて
:
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言語の構造体の初期化子であります}}}、定義のポイントでのみ使用できます。
我々は、それはまだ失敗コンストラクタで初期化リストを使用するように、これを変更しても:それは失敗し、唯一のを見て、いくつかの状況で初期化のために使用することが、なぜ
#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
}
を。 – Flexo
@Flexo、OOPS、申し訳ありません。 – Alcott
謝罪する必要はありません! – Flexo