将'm_Mutex'声明为引用但未初始化错误

时间:2012-04-05 09:44:01

标签: c++ linux pthreads mutex

我正在尝试在我的单吨类的静态功能之一上实现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.


}

任何帮助都将受到高度赞赏。 谢谢, Yuvi

1 个答案:

答案 0 :(得分:12)

这实际上是“最令人尴尬的解析”问题的变体。 除了作为成员之外,你没有在任何地方定义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 );

例如。