获取'm_Mutex'声明为引用,但没有初始化错误

我正在尝试在单个类的静态函数之一上实现互斥锁。 但是得到这个错误:

$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 ); 

例如。