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

Getting ‘m_Mutex’ declared as reference but not initialized error

本文关键字:引用 初始化 错误 声明 Mutex      更新时间:2023-10-16

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

$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;
};
=========

互斥.h======

#include "CommonDefines.h"
class MutexImplementation
{
  private:
     static pthread_mutex_t m_Mutex ;
  public:
     static void commonFunction();
};

====互斥实现.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 );

例如。