2012-04-11 8 views
0

현재 문제가 발생했습니다. VS2010은 "핵무기"생성자에서 사용 된 "TFunctionPointer"가 datamember가 정의되지 않았기 때문에 &으로 정의됩니다. 누군가 이것이 내게 왜 설명해 주시겠습니까? 어떤 도움이라도 대단히 감사합니다.템플릿 멤버 함수 포인터

template<typename T> 
typedef void (T::* TFunctionPointer)(); 

class Nuke 
{ 
public: 
    Nuke(TFunctionPointer pFunction); 
    virtual ~Nuke(); 

private: 
    TFunctionPointer m_pFunction; 

}; 

// 편집

난 할 노력하고있어하는 클래스의 모든 유형에 대한 함수 포인터를 저장하고 핵무기 객체의 파괴를 호출 할 수있다

. RAII에 대한 비꼬아. 그러나 나는 그것이 불가능하다고 생각한다. 도움을 주셔서 감사합니다.

// EDIT

은 분명히 부스트 :: shared_ptr의 내가 찾고 있었던 것입니다.

답변

4

템플릿 typedef는 C++에서 유효하지 않습니다.

(모두 ++ "새로운"C "이전"과에서)이 비록 당신이 할 수있는 일 :

template <typename T> 
struct TFunctionPointer 
{ 
    typedef void (T::*Type)(); 
}; 

class Nuke 
{ 
public: 
    Nuke(TFunctionPointer<Nuke>::Type pFunction); 
    virtual ~Nuke(); 

private: 
    TFunctionPointer<Nuke>::Type m_pFunction; 
}; 
+0

이 답변이 작성 당시 아마 정확했다 :

당신은 형태로 함수 포인터를 포장하고 properinstantiation를 사용할 수 있습니다. 이를 명확히하기 위해 편집이 될 수 있습니다. –

0

C++ 템플릿의 형식 정의를 지원하지 않기 때문에 template<typename T> typedef는 불법입니다.

C++ 11을 사용할 수있는 경우 템플릿 별칭을 사용할 수 있습니다. 나는 그 memberfunction 포인터로 가능하며 구문이 올바른 보장 할 수없는 경우 확실히 모르겠지만, 나는 다음과 같은 것으로 기대 : 물론 VS2010의

template <typename T> 
using TFunctionPointer = void(T::*)(); 

것은 아마도 지원하지 않습니다 어쨌든.

어쨌든 Nuke 클래스는 TFunctionPointer에 대한 유형을 제공하지 않으므로 해당 유형 정의가 유효한 경우에도 구체적인 유형 대신에 템플릿을 전달하려고 시도 할 수도 있습니다. 하지만 더 이상,

template<typename T> struct FunctionPointer { typedef void (T::*Type)(); }; 
class Nuke { 
public: 
    Nuke(FunctionPointer<Nuke>::Type pFunction); 
    virtual ~Nuke(); 
private: 
    FunctionPointer<Nuke>::Type m_pFunction; 

}; 
+0

vs11beta에서 기쁨이 없습니다. 어쨌든 고마워 :) – Zerreth

관련 문제