我不認爲我的問題是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 *作爲編譯時可用的模板參數似乎是錯誤的。 :-(
成員's_bLock'本身,除非你不存在實例的'CReentranceLock' 。'szFunctionName'只是一個不存在的佔位符名稱(正如編譯器警告你的那樣)。試試'const char Foo [] = {「Foo」}; bool CRentranceLock :: s_bLock = false;'instea d。 (但是你只會設置''Foo''類型的'CReentranceLock'的s_bLock')。 –
@StephaneRolland:你是對的,學到了一些東西。 –
@StephaneRolland:你是在暗示const char *可以轉換爲int嗎? – dirkgently