class A { public: A(); private: pthread_mutex_t mu; }; A::A() { mu = PTHREAD_MUTEX_INITIALIZER; //cannot compile } Can't I initialize pthread_mutex_t inside a class member function?
4 Réponses :
Utilisez pthread_mutex_init code>
Dans ce cas, comme la constante est Pour l'initialisation du temps de compilation. P>
Ensuite, je ne peux pas mettre pthread_mutex_t code> membre de données dans la liste d'initialisation, puis-je?
Désolé, je voulais dire une initialisation du temps compilé, pas une initialisation statique. Et oui, vous ne pouvez pas le mettre (au moins sinon pas en C ++ 11) dans les listes d'initialisation.
au lieu de ceci: Essayez ceci: p> A::A()
{
pthread_mutex_init( &(mu), NULL);
}
Même si nous modifions ceci pour utiliser une liste d'initialiseurs dans le constructeur, il échoue toujours:
A::A() { const pthread_mutex_t test = PTHREAD_MUTEX_INITIALIZER; // initialization - fine mu = test; // assignment - fine mu = PTHREAD_MUTEX_INITIALIZER; // assignment - C++11 only }
Le code d'origine est légal C ++ 11 également, vous n'avez probablement pas la prise en charge C ++ 11 activée dans votre compilateur.
@Alcott Il n'y a que 3 versions majeures de la norme - Ne mélangez pas les versions du compilateur d'un fournisseur spécifique avec des versions standard.
J'aime les réponses de @askmish & @diego. J'aime aussi ce que @flexo a expliqué.
mais simplement comme une option, si vous souhaitez l'initialisation avec le et vous pouvez ensuite initialiser ce mutex statique dans votre fichier source, mais en dehors de toute fonction membre, comme celui-ci: P> vos options: strong> p> pthread_mutex_initializer code> macro, ce que vous pouvez faire est de faire la déclaration mutex à l'intérieur de la définition de la classe < Code> statique code> comme ceci: p>
pthread_mutex_init () code> (comme d'autres ont indiqué) à l'intérieur de votre fonction de membre. LI>
ul> p>
Ce que vous montrez, c'est une affectation et non une initialisation.