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;