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

C++ 如何初始化参数化模板类的静态成员,c++,visual-studio-2010,templates,C++,Visual Studio 2010,Templates,我不认为我的问题是双重的 我想做的是: template<const char* szFunctionName> class CReentranceLock { public: CReentranceLock(){} ~CReentranceLock(){} bool isLocked(){return s_bLock;} void setLocked(bool b) { const bool Result=(bool)Inte

我不认为我的问题是双重的

我想做的是:

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'
我做错了什么或想错了什么

P> PS:我不是在处理重新进入就像是一个糟糕的设计(在MFC中),我知道,我迷失在它的中间;p> 编辑:虽然下面的答案很好,而且定义很好。。。我在CMyObject::InAnyFunction()中使用const char*作为编译时可用的模板参数似乎是错误的:-(

bool-creentraclock::s_bLock=false;
这应该是:

bool CReentranceLock<szFunctionName>::s_bLock=false; 
bool-creentraclock::s_bLock=false;

只需将行更改为


bool CReentranceLock::s_bLock=false;

成员
s_bLock
本身不存在,除非您实例一个
CReentranceLock
szFunctionName
只是一个不存在的占位符名称(正如编译器警告您的那样)。请尝试
const char Foo[]={“Foo”};bool CReentranceLock::s_bLock=false;
(但您将仅设置
CReentranceLock的
Foo
实例类型的
s_bLock
).@StephaneRolland:你说得对,学到了一些东西。@StephaneRolland:你是说
const char*
可以转换成
int
?@很直接,这就是我的想法,尽管这可能取决于你是在32位还是64位系统上。在64位系统上,我认为这是一个64位整数。@Yochai,不是pb人,你可以保留您的评论。不,您需要在那里使用模板参数(即使模板化)。很抱歉。输入错误。因为已经提供了答案,我将对其进行编辑
error C2146: syntax error : missing ',' before identifier 'szFunctionName'
bool CReentranceLock<const char*szFunctionName>::s_bLock=false; 
bool CReentranceLock<szFunctionName>::s_bLock=false;