将“m_Mutex”声明为引用但未初始化错误
Getting ‘m_Mutex’ declared as reference but not initialized error
我正在尝试在我的单吨类的一个静态函数上实现互斥锁。但是收到此错误:
$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 );
例如。
相关文章:
- C++-模板嵌套类的引用初始化无效
- 在引用初始化中使用已删除的复制构造函数进行复制初始化
- 模板流运算符重载错误:引用初始化无效,与basic_istream和basic_ifstream之间的差异有关
- 具有字符串文本构造函数的类不适用于 const 引用初始化
- 类型为"短整型 (&)"的引用初始化无效
- 引用初始化和常量表达式
- 在Visual Studio 2013中为rvalue引用初始化捕获
- 从大括号括起来的初始值设定项列表进行的Lvalue引用初始化无法编译
- Visual C++ 2015 中右值的非常量引用初始化无效
- 是否可以使用对派生类实例的基类引用初始化派生类引用
- 类型'int&'的引用初始化无效,传递参数 1 时出错
- 引用初始化表单
- 从类型为"int*"的临时引用初始化类型为"int&"的非常量引用无效
- 简单的C++日志记录类-ostream引用初始化
- 错误:类型为"cv::Mat&"的非常量引用初始化无效
- 为什么我收到类型为"const vec&"的引用初始化无效
- 从类型为"char*"的临时引用初始化类型为"char*&"的非常量引用
- 为什么这会发送一个关于引用初始化无效的错误
- 为什么此处不对引用初始化执行复制初始化?
- std::vector不会为多个向量条目创建cv::Mat的新引用——初始化矩阵时,数据会被覆盖