2012-06-22 3 views
1

Я не думаю, что мой вопрос является дубликатом 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 будет иметь свои собственные статические, опираясь на константным полукокса адрес имени функции, переданной в качестве параметра шаблона.

и которые могут быть использованы, как это:

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: и я не имею дела с тем, что reentrance пахнущее как awfull дизайн (в MFC), я знаю, я потерял в середине этого ;-)

Редактировать: хотя ответ ниже хорош, и определение компилируется ... мое использование в CMyObject :: InAnyFunction() с const char * как параметр шаблона, доступный во время компиляции, кажется неправильным. :-(

+0

г. Член 's_bLock' сама не существует, если вам экземпляр' CReentranceLock' . 'szFunctionName' - это только имя заполнителя, которое не существует (как предупреждает компилятор). Попробуйте' const char Foo [] = {"Foo"}; bool CReentranceLock :: s_bLock = false; 'instea д. (но вы установите только 's_bLock' типа экземпляра' Foo' 'CReentranceLock'). –

+0

@StephaneRolland: Ты прав, узнал что-то. –

+0

@StephaneRolland: Вы предполагаете, что 'const char *' конвертируется в 'int'? – dirkgently

ответ

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

Это должно быть:

bool CReentranceLock<szFunctionName>::s_bLock=false; 
+0

Да, ты рок! –

0

Просто измените строку

bool CReentranceLock<szFunctionName>::s_bLock=false;

+0

Нет, вам нужно использовать параметр шаблона (даже если шаблонный). – Griwes

+0

Извините. Опечатка. Поскольку ответ уже предоставлен, я его отредактирую – Raj

Смежные вопросы