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

时间:2012-06-22 09:04:27

标签: c++ visual-studio-2010 templates

我认为我的问题不是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 *作为模板参数在编译时可用是错的。 : - (

2 个答案:

答案 0 :(得分:2)

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

这应该是:

bool CReentranceLock<szFunctionName>::s_bLock=false; 

答案 1 :(得分:0)

只需将行更改为

即可

bool CReentranceLock<szFunctionName>::s_bLock=false;

相关问题