2012-04-11 9 views
0

Ich habe derzeit ein Problem, VS2010 Nags, dass "TFunctionPointer" im Konstruktor von "Nuke" & als Datamember verwendet wird, ist undefiniert. Könnte mir bitte jemand erklären, warum das so ist? Jede Hilfe wird sehr geschätzt.Template Member Funktion Pointer

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

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

private: 
    TFunctionPointer m_pFunction; 

}; 

// EDIT

Was ich versuche ein Funktionszeiger auf jede Art von Klasse zu tun erlauben ist auf Zerstörung des Nuke-Objekt gespeichert und aufgerufen werden. Eine Wendung auf RAII. Aber ich denke, es ist nicht möglich. Danke für die Hilfe Jungs.

// EDIT

Anscheinend boost :: shared_ptr ist das, was ich suchte.

Antwort

4

Template typedefs sind in C++ nicht zulässig.

Was Sie jedoch tun (in beiden "alten" und "neuen" C++) ist dies:

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

Diese Antwort zu der Zeit wahrscheinlich richtig war es geschrieben wurde, aber nicht mehr. Eine Änderung könnte vorhanden sein, um dies zu verdeutlichen. –

0

C++ nicht Vorlage typedefs unterstützen, so template<typename T> typedef illegal ist.

Wenn Sie C++ 11 verwenden können, können Sie möglicherweise Vorlagen-Aliase verwenden. Ich bin mir nicht ganz sicher, ob das mit memberfunction Zeigern möglich und kann nicht garantieren, die Syntax korrekt ist, aber ich würde erwarten, dass es so etwas wie die folgenden sein: VS2010

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

Natürlich wahrscheinlich nicht unterstützen das sowieso.

Anyways Ihre Nuke Klasse gibt keinen Typ für die TFunctionPointer, also selbst wenn dieser Typdef wo legal ist, versuchen Sie, eine Vorlage anstelle eines konkreten Typs zu übergeben, was nicht möglich ist.

Sie könnten Ihre Funktionszeiger in eine Art wickeln und eine properinstantiation verwenden:

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

Keine Freude in vs11beta. Danke trotzdem :) – Zerreth

Verwandte Themen