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

Posted

技术标签:

【中文标题】将“m_Mutex”声明为引用但未初始化错误【英文标题】:Getting ‘m_Mutex’ declared as reference but not initialized error 【发布时间】:2012-04-05 09:44:01 【问题描述】:

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

$error:‘m_Mutex’ declared as reference but not initialized
$warning:warning: unused variable ‘m_Mutex’

这是我的代码 sn-p。

========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.



任何帮助将不胜感激。 谢谢, 尤维

【问题讨论】:

【参考方案1】:

这确实是“最尴尬的解析”问题的变体。 您没有在任何地方定义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 );

例如。

【讨论】:

当我使用LockBlock& localRefToMutex( &MutexImplementation::m_Mutex ); M 得到invalid initialization of non-const reference of type ‘LockBlock&’ from a temporary of type ‘pthread_mutex_t*’ 但当我使用LockBlock localRefToMutex( &MutexImplementation::m_Mutex ); 时,它正在正确编译。 我在进行更正时并没有超越语法。语义也很重要:localRefToMutex 应该指的是什么?表达式&MutexImplementation::m_Mutex 没有LockBlock 类型,即使有,它也不是左值,因此不能用于初始化对LockBlock 的引用。

以上是关于将“m_Mutex”声明为引用但未初始化错误的主要内容,如果未能解决你的问题,请参考以下文章

如果声明但未初始化,对象的变量是不是使用内存空间?

尝试在 ANDROID 资源中使用 <!ENTITY 时出现错误:“实体已被引用,但未声明。”

精通awk系列(14):细说awk中的变量和变量赋值

final修饰符

为啥非 const 引用必须用左值初始化?

JavaScript中undefined和null的区别