2012-06-22 172 views
1

我不认为我的问题是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); 
} 

很好,这只是理论... 可惜这并不在视觉2010编译,在该行,我尝试初始化静态。

error C2146: syntax error : missing ',' before identifier 'szFunctionName' 

我在做什么或想错了什么?

PS:和我不对付的事实,再进入中闻像awfull设计(在MFC),我知道,我迷失在它的中间;-)

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

+0

成员's_bLock'本身,除非你不存在实例的'CReentranceLock' 。'szFunctionName'只是一个不存在的占位符名称(正如编译器警告你的那样)。试试'const char Foo [] = {“Foo”}; bool CRentranceLock :: s_bLock = false;'instea d。 (但是你只会设置''Foo''类型的'CReentranceLock'的s_bLock')。 –

+0

@StephaneRolland:你是对的,学到了一些东西。 –

+0

@StephaneRolland:你是在暗示const char *可以转换为int吗? – dirkgently

回答

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

这应该是:

bool CReentranceLock<szFunctionName>::s_bLock=false; 
+0

是的,你摇滚! –

0

只要改变行

bool CReentranceLock<szFunctionName>::s_bLock=false;

+0

不,你需要使用模板参数(即使是模板化)。 – Griwes

+0

对不起。一个错字。由于答案已经提供,我会编辑它 – Raj