2013-01-16 3 views
1

를 선언 할 때 :포인터이 내가 달성하기 위해 무엇을하려고하는 템플릿

class MyClass 
{ 
    public: 
    template<typename T> 
    void whenEntering(const std::string& strState, 
         T& t, 
         void T::(*pMemberFunction)(void)) /// compilation fails here 
    { 
     t.(*pMemberFunction)(); // this line is only an example 
    } 
} 

그것은 내가받는 일부 이벤트에 반응에 대한 콜백 시스템의 종류입니다. 그러나 비주얼 2010

나에게 다음과 같은 컴파일 오류가 있습니다 :

error C2589: '(' : illegal token on right side of '::' 

내가 포인터 - 투 - 회원 구문이 잘못 될 수있다를 ... 그러나 나는 또한이 템플릿을 정의 할 수 있음을 두려워 너는 어떤 생각을 가지고 있니?

답변

6

당신은 다른 문제는 단지 아마 당신의 사용 예제에 오타이지만, 멤버 함수를 호출하면 하나의 연산자로 .* 사용 void (T::*pMemberFunction)(void)

를 원하는; 그 사이에 공백이나 (을 사용할 수 없습니다. 나는 포인터 - 투 - 회원 사업자가 가지고있는 이상한 연산자 우선 순위에 대처하는 올바른 방법이 거의 때문에 그 오타 같은데요 : 코드에서 몇 가지 문제가 있습니다

(t.*pMemberFunction)(); 
+0

:

전반적으로는,이 같은 코드를 보는 방법입니다! –

1

. 특히, 멤버 함수에 대한 포인터를 선언하는 구문은 void (T::* pMemberFunction)(void)이다 : 그것은 지금 잘 컴파일

class MyClass 
{ 
    public: 
    template<typename T> 
    void whenEntering(const std::string& strState, 
         T& t, 
         void (T::* pMemberFunction)(void) 
           ) /// this fails 
    { 
     t.*pMemberFunction(); // this line is only an example 
    } 
}; 
관련 문제