【问题标题】:Getting ‘m_Mutex’ declared as reference but not initialized error将“m_Mutex”声明为引用但未初始化错误
【发布时间】: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.


}

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

【问题讨论】:

    标签: c++ linux pthreads mutex


    【解决方案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 的引用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-28
    • 1970-01-01
    • 2021-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多