【发布时间】:2012-06-22 09:04:27
【问题描述】:
我不认为我的问题与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);
}
嗯,这只是理论... 不幸的是,这在 Visual 2010 下无法编译,在我尝试初始化静态的那一行。
error C2146: syntax error : missing ',' before identifier 'szFunctionName'
我在做什么或想错了什么?
PS:我并没有处理重入(在 MFC 中)闻起来像糟糕的设计这一事实,我知道,我迷失在其中 ;-)
编辑:虽然下面的答案很好,并且定义编译...我在 CMyObject::InAnyFunction() 中使用 const char * 作为编译时可用的模板参数似乎是错的。 :-(
【问题讨论】:
-
成员
s_bLock本身不存在,除非您实例化CReentranceLock。szFunctionName只是一个不存在的占位符名称(编译器会警告您)。请改用const char Foo[] = {"Foo"}; bool CReentranceLock<Foo>::s_bLock=false;。 (但您将只设置Foo实例类型CReentranceLock的s_bLock)。 -
@StephaneRolland:你是对的,学到了一些东西。
-
@StephaneRolland:你是说
const char *可以转换成int吗? -
@dirkgently 好吧,这就是我的想法,尽管这可能取决于您使用的是 32 位还是 64 位系统。在 64 位系统上,我认为它是一个 64 位整数。
-
@Yochai,没有铅,你可以保留你的评论。
标签: c++ visual-studio-2010 templates