【问题标题】:How to initialize a static member of a parametrized-template class如何初始化参数化模板类的静态成员
【发布时间】: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 本身不存在,除非您实例化CReentranceLockszFunctionName 只是一个不存在的占位符名称(编译器会警告您)。请改用const char Foo[] = {"Foo"}; bool CReentranceLock&lt;Foo&gt;::s_bLock=false;。 (但您将只设置Foo 实例类型CReentranceLocks_bLock)。
  • @StephaneRolland:你是对的,学到了一些东西。
  • @StephaneRolland:你是说const char * 可以转换成int吗?
  • @dirkgently 好吧,这就是我的想法,尽管这可能取决于您使用的是 32 位还是 64 位系统。在 64 位系统上,我认为它是一个 64 位整数。
  • @Yochai,没有铅,你可以保留你的评论。

标签: c++ visual-studio-2010 templates


【解决方案1】:
bool CReentranceLock<const char*szFunctionName>::s_bLock=false; 

这应该是:

bool CReentranceLock<szFunctionName>::s_bLock=false; 

【讨论】:

    【解决方案2】:

    只需将行改为

    bool CReentranceLock&lt;szFunctionName&gt;::s_bLock=false;

    【讨论】:

    • 不,你需要在那里使用模板参数(即使是模板化的)。
    • 很抱歉。一个错字。由于已经提供了答案,我将对其进行编辑
    猜你喜欢
    • 1970-01-01
    • 2016-03-10
    • 1970-01-01
    • 1970-01-01
    • 2011-03-14
    • 2021-10-21
    • 2019-05-03
    • 1970-01-01
    相关资源
    最近更新 更多