2012-06-22 4 views
1

내 질문에 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 * 사용하여 템플릿 매개 변수로 컴파일 시간에 사용할 수 잘못되었습니다. :-(

+0

멤버 '로 라인을 변경'CReentranceLock' 당신이하지 않는 인스턴스를 존재하지 않는 자체 s_bLock' 'szFunctionName'은 존재하지 않는 자리 표시 자 이름입니다 (컴파일러가 경고 할 때). const char Foo [] = { "Foo"}; bool CReentranceLock :: s_bLock = false;'instea 디. (그러나 'Fe' 인스턴스 유형의's_bLock' 만'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

관련 문제