我不认为我的问题重复this one.
我尝试做的事情:
template<const char* szFunctionName>
class CReentranceLock
{
public:
CReentranceLock(){}
~CReentranceLock(){}
bool isLocked(){return s_bLock;}
void setLocked(bool b)
{
const bool Result=(bool)InterlockedCompareExchange(
(unsigned long *)&s_bLock, b, !b);
}
private:
static bool s_bLock;
};
template<const char* szFunctionName>
bool CReentranceLock<const char*szFunctionName>::s_bLock=false;
// error C2146: syntax error : missing ',' before identifier 'szFunctionName'
这意味着 CReentranceLock 的所有实例都将拥有自己的静态,依赖于作为模板参数传递的函数名称的 const char 地址。
可以这样使用:
void CMyObject::InAnyFunction()
{
const char* szFunctionName = __FUNCTION__;
CReentranceLock<szFunctionName> lock; // Edit: <- this doesn't work
if(lock.isLocked()) return;
lock.setLocked(true);
/// business code
lock.setLocked(false);
}
好吧,这只是理论......
不幸的是,这不能在 Visual 2010 下编译,在我尝试初始化静态数据的行。
error C2146: syntax error : missing ',' before identifier 'szFunctionName'
我做错了什么或想错了什么?
PS:我没有处理重入闻起来像一个糟糕的设计(在 MFC 中)的事实,我知道,我迷失在其中;-)
Edit:虽然下面的答案很好,并且定义编译...我的使用CMyObject::InAnyFunction()
使用 const char * 作为编译时可用的模板参数似乎是错误的。 :-(
bool CReentranceLock<const char*szFunctionName>::s_bLock=false;
这应该是:
bool CReentranceLock<szFunctionName>::s_bLock=false;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)