将“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”声明为引用但未初始化错误的主要内容,如果未能解决你的问题,请参考以下文章