2

私の質問はこれと重複しているとは思いません。

私がやろうとしていること:

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'

テンプレートのパラメーターとして渡された関数名の const char アドレスに依存して、CRentranceLock のすべてのインスタンスが独自の静的を持つことを意味します。

これは次のように使用できます。

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);
}

まあ、それは単なる理論です...そして残念ながら、これはビジュアル2010の下で、静的を初期化しようとする行でコンパイルされません。

error C2146: syntax error : missing ',' before identifier 'szFunctionName'

私は何をしているのか、間違っているのか?

PS: そして、再入可能性が (MFC で) ひどいデザインのようなにおいがするという事実を扱っているわけではありません。

編集:以下の答えは良いですが、定義はコンパイルされます...コンパイル時に利用可能なテンプレートパラメータとして const char * を使用した CMyObject::InAnyFunction() での私の使用は間違っているようです。:-(

4

2 に答える 2

3
bool CReentranceLock<const char*szFunctionName>::s_bLock=false; 

これは次のようになります。

bool CReentranceLock<szFunctionName>::s_bLock=false; 
于 2012-06-22T09:15:34.507 に答える
0

行を次のように変更するだけです

bool CReentranceLock<szFunctionName>::s_bLock=false;

于 2012-06-22T09:16:07.067 に答える