一个单例模板怎样实现其内嵌类的静态变量的宣言
一个单例模板怎样实现其内嵌类的静态变量的声明?
代码如下:
class CHandleLock
{
public:
CHandleLock(HANDLE t):m_T(t)
{
WaitForSingleObject(m_T, INFINITE);
}
~CHandleLock()
{
ReleaseMutex(m_T);
}
private:
HANDLE m_T;
};
template<class T>
class CSingle
{
private:
CSingle() {}
~CSingle()
{
if (m_hLock)
{
CloseHandle(m_hLock);
m_hLock = NULL;
}
}
public:
static T* GetInstance()
{
if (NULL == m_pInstance)
{
CHandleLock lock(m_hLock);
if (NULL == m_pInstance)
{
m_pInstance = new T;
}
}
return m_pInstance;
}
private:
class CAutoDelete
{
public:
CAutoDelete()
{
}
~CAutoDelete()
{
if (m_pInstance)
{
delete m_pInstance;
m_pInstance = NULL;
}
}
};
static CAutoDelete m_pAutoDel;
static T* m_pInstance;
static HANDLE m_hLock;
};
template<class T>
T* CSingle<T>::m_pInstance = NULL;
template<class T>
CSingle<T>::CAutoDelete CSingle<T>::m_pAutoDel;
template<class T>
HANDLE CSingle<T>::m_hLock = CreateMutex(NULL, TRUE, NULL);
编译时提示:
error C2143: 语法错误 : 缺少“;”(在“CSingle<T>::m_pAutoDel”的前面)
error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
fatal error C1903: 无法从以前的错误中恢复;正在停止编译
注释掉这两行编译通过,请问下这里的声明哪里出问题了?
template<class T>
CSingle<T>::CAutoDelete CSingle<T>::m_pAutoDel;
------解决方案--------------------
CSingle<T>::CAutoDelete 前面加一个typename试试:
代码如下:
class CHandleLock
{
public:
CHandleLock(HANDLE t):m_T(t)
{
WaitForSingleObject(m_T, INFINITE);
}
~CHandleLock()
{
ReleaseMutex(m_T);
}
private:
HANDLE m_T;
};
template<class T>
class CSingle
{
private:
CSingle() {}
~CSingle()
{
if (m_hLock)
{
CloseHandle(m_hLock);
m_hLock = NULL;
}
}
public:
static T* GetInstance()
{
if (NULL == m_pInstance)
{
CHandleLock lock(m_hLock);
if (NULL == m_pInstance)
{
m_pInstance = new T;
}
}
return m_pInstance;
}
private:
class CAutoDelete
{
public:
CAutoDelete()
{
}
~CAutoDelete()
{
if (m_pInstance)
{
delete m_pInstance;
m_pInstance = NULL;
}
}
};
static CAutoDelete m_pAutoDel;
static T* m_pInstance;
static HANDLE m_hLock;
};
template<class T>
T* CSingle<T>::m_pInstance = NULL;
template<class T>
CSingle<T>::CAutoDelete CSingle<T>::m_pAutoDel;
template<class T>
HANDLE CSingle<T>::m_hLock = CreateMutex(NULL, TRUE, NULL);
编译时提示:
error C2143: 语法错误 : 缺少“;”(在“CSingle<T>::m_pAutoDel”的前面)
error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
fatal error C1903: 无法从以前的错误中恢复;正在停止编译
注释掉这两行编译通过,请问下这里的声明哪里出问题了?
template<class T>
CSingle<T>::CAutoDelete CSingle<T>::m_pAutoDel;
------解决方案--------------------
CSingle<T>::CAutoDelete 前面加一个typename试试:
typename CSingle<T>::CAutoDelete CSingle<T>::m_pAutoDel;