如何初始化参数化模板类的静态成员
How to initialize a static member of a parametrized-template class
我不认为我的问题与这个问题重复。
我尝试做什么:
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'
这意味着 CReentryLock 的所有实例都有自己的静态,依赖于作为模板参数传递的函数名称的 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);
}
好吧,这只是理论...不幸的是,这在 Visual 2010 下无法编译,在我尝试初始化静态的行中。
error C2146: syntax error : missing ',' before identifier 'szFunctionName'
我做错了什么或想错了什么?
PS:我不是在处理重新进入闻起来像一个糟糕的设计(在 MFC 中)的事实,我知道,我迷失在中间;-)
编辑:虽然下面的答案很好,并且定义编译...我在CMyObject::InAnyFunction()
中使用常量字符 * 作为编译时可用的模板参数似乎是错误的。:-(
bool CReentranceLock<const char*szFunctionName>::s_bLock=false;
这应该是:
bool CReentranceLock<szFunctionName>::s_bLock=false;
只需将行更改为
bool CReentranceLock<szFunctionName>::s_bLock=false;
相关文章:
- C++模板类静态成员初始化
- C :(不重复)积分静态成员初始化(不仅是声明!),导致链接器错误,原因
- 向模板化静态成员初始化添加和不添加'typename'都会出错
- 模板类中的静态成员初始化
- 模板专用化和静态成员初始化
- 静态内联方法无需静态成员初始化
- 静态成员初始化链接错误
- 类内静态成员初始化
- 跨系统的静态成员初始化
- C++类静态成员初始化
- gcc中模板的非延迟静态成员初始化
- Clang++Xcode 4.4非静态成员初始化和移动构造函数
- 为什么静态成员初始化需要"typed again"?
- 即使启用了 C++11,静态成员初始化也不适用于 GCC
- C++静态成员初始化顺序
- 常量静态成员初始化 - 类定义内部与外部类定义
- 如何保证 const 静态成员初始化顺序
- 在单独的库中使用 CRTP 进行静态成员初始化
- 静态成员初始化和可变模板
- 模板化的外部类静态成员初始化