如何初始化参数化模板类的静态成员

How to initialize a static member of a parametrized-template class

本文关键字:静态成员 初始化 参数      更新时间:2023-10-16

我不认为我的问题与这个问题重复。

我尝试做什么:

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'

这意味着 CReentryLock 的所有实例都有自己的静态,依赖于作为模板参数传递的函数名称的 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 中)的事实,我知道,我迷失在中间;-)

编辑:虽然下面的答案很好,并且定义编译...我在CMyObject::InAnyFunction()中使用常量字符 * 作为编译时可用的模板参数似乎是错误的。:-(

bool CReentranceLock<const char*szFunctionName>::s_bLock=false; 

这应该是:

bool CReentranceLock<szFunctionName>::s_bLock=false; 

只需将行更改为

bool CReentranceLock<szFunctionName>::s_bLock=false;