2012-06-22 177 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