我正在尝试在单个类的静态函数之一上实现互斥锁。 但是得到这个错误:
$error:'m_Mutex' declared as reference but not initialized $warning:warning: unused variable 'm_Mutex'
这是我的代码片段。
======== Commondefines.h ==========
/** *@class LockBlock *This class is used to provide Mutex Lock on thread. */ class LockBlock { public: LockBlock(pthread_mutex_t *mutex) { lockMutex = mutex; pthread_mutex_lock(lockMutex); }; ~LockBlock() { pthread_mutex_unlock(lockMutex); lockMutex = NULL; } private: pthread_mutex_t *lockMutex; };
======== MutexImplenation.h ======
#include "CommonDefines.h" class MutexImplementation { private: static pthread_mutex_t m_Mutex ; public: static void commonFunction(); };
==== MutexImplementation.cpp ==========
// Initialize static member of class. pthread_mutex_t MutexImplentation::m_Mutex = PTHREAD_MUTEX_INITIALIZER; void commonFunction() { LockBlock(&m_Mutex); // Here I am getting this error. }
任何帮助将不胜感激。 谢谢,尤维
这实际上是“最令人尴尬的解析”问题的一个变种。 除了作为m_Mutex
的成员之外,你还没有定义MutexImplementation
,所以在MutexImplementation
之外,它的名字是MutexImplementation::m_Mutex
(因为它是私有的,所以你不能合法地访问它)。 当你写:
LockBlock (&m_Mutex);
,编译器找不到m_Mutex
,所以假设你正在定义一个局部变量。 括号是合法的,但是没有效果,声明也是一样的:
LockBlock& m_Mutex;
对LockBlock
的引用和引用只能在被初始化时才能被定义。
如果你想要一个局部变量,你必须给它一个名字。 如果你想把它初始化为m_Mutex
,你必须公开m_Mutex
,并指定类名称:
LockBlock& localRefToMutex( &MutexImplementation::m_Mutex );
例如。