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

我认为我的问题不是重复的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中)的事实,我知道,我迷失在其中;-)

编辑:尽管下面的答案是好的,并且定义可以编译…我在CMyObject :: InAnyFunction()中使用const char *作为编译时可用的模板参数似乎是错误的.

上一篇:Vue的常见修饰符


下一篇:项目中在input输入框中回车会导致页面刷新问题