내 질문에 dupplicate가 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 문자 주소에 의존.
하고이 같이 사용될 수있다 : 단지 이론 ... 그리고 나는 정적을 초기화하려고 곳 불행하게도이 라인에서, 비주얼 2010에서 컴파일되지 않습니다
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);
}
아니라. 내가 뭘 또는 잘못 생각하고 무엇을
error C2146: syntax error : missing ',' before identifier 'szFunctionName'
?
PS : 나는 재입국이 (MFC에서)을 awfull 디자인처럼 냄새가된다는 사실, 나는 알고있다, 나는 그것의 중간에 분실하고 다루고 있지 않다는
편집을 ;-) :하지만 아래의 대답은 좋은, 그리고 정의 컴파일 ... CMyObject :: InAnyFunction() const char * 사용하여 템플릿 매개 변수로 컴파일 시간에 사용할 수 잘못되었습니다. :-(
멤버 '로 라인을 변경'CReentranceLock' 당신이하지 않는 인스턴스를 존재하지 않는 자체 s_bLock' 'szFunctionName'은 존재하지 않는 자리 표시 자 이름입니다 (컴파일러가 경고 할 때). const char Foo [] = { "Foo"}; bool CReentranceLock :: s_bLock = false;'instea 디. (그러나 'Fe' 인스턴스 유형의's_bLock' 만'CReentranceLock'으로 설정합니다). –
@StephaneRolland : 네 말이 맞아, 뭔가를 배웠다. –
@StephaneRolland :'const char *'가'int'로 변환 가능하다고 제안 하시겠습니까? – dirkgently