Я не думаю, что мой вопрос является дубликатом 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 * как параметр шаблона, доступный во время компиляции, кажется неправильным. :-(
г. Член 's_bLock' сама не существует, если вам экземпляр' CReentranceLock' . 'szFunctionName' - это только имя заполнителя, которое не существует (как предупреждает компилятор). Попробуйте' const char Foo [] = {"Foo"}; bool CReentranceLock :: s_bLock = false; 'instea д. (но вы установите только 's_bLock' типа экземпляра' Foo' 'CReentranceLock'). –
@StephaneRolland: Ты прав, узнал что-то. –
@StephaneRolland: Вы предполагаете, что 'const char *' конвертируется в 'int'? – dirkgently