2014-12-15 4 views
0

파생 클래스에서 함수에 대한 포인터를 저장하는 기본 클래스가 있습니다. BaseClass와 파생 클래스에서 포인터로 함수를 호출해야합니다.함수를 포인터로 호출하는 방법?

template < class T > 
class BaseClass { 
private: 
    typedef void (T::*FunctionPtr)(); 
    FunctionPtr funcPtr; 
public: 
    void setFunc(FunctionPtr funcPtr) { 
     this->funcPtr = funcPtr; 
     (this->*funcPtr)(); // I need to call it here also but it doesn't work 
    } 
}; 

class DerivedClass: public BaseClass <DerivedClass> { 
public: 
    void callMe() { 
     printf("Ok!\n"); 
    } 
    void mainFunc() { 
     setFunc(&DerivedClass::callMe); 
     (this->*funcPtr)(); // works fine here 
    } 
}; 

오류 : 왼쪽 피연산자 -> * 오른쪽 피연산자와 호환 클래스에 대한 포인터 될 수 있지만 'BaseClass로 *'

+3

당신은 '왼쪽으로 this'가'사용할 수 없습니다

당신은 사용할 필요가 T' –

+0

@RyanHaining 감사합니다. 코드 조각을 피하는 방법을 보여줄 수 있습니까? – JavaRunner

답변

4
(this->*funcPtr)(); 

전화를 사용하는 잘못된 구문입니다한다 funcPtr 유형은 funcPtr이므로 void T::*()입니다. -`this`가`BaseClass로 `을 입력있다`때문에 *`, 그것은에서> 상속하지 않습니다

((static_cast<T*>(this))->*funcPtr)(); 
+3

기본 클래스에서'static_cast '(std :: is_base_of :: value, "T는 BaseClass를 파생시키지 않습니다")를 추가하여 "static_cast"가 안전한지 확인하십시오. 아무도 잘못 사용하지 않도록하십시오 너의 패턴 –

관련 문제