2012-04-11 163 views
0

我目前有一個問題,VS2010認爲「TFunctionPointer」用在「Nuke」&的構造函數中,因爲datamember是未定義的。有人可以向我解釋爲什麼這是嗎?很感謝任何形式的幫助。模板成員函數指針

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

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

private: 
    TFunctionPointer m_pFunction; 

}; 

//編輯

我想要做的就是讓一個函數指針到任何類型的類存儲,並呼籲核彈對象的破壞。在RAII上扭曲。但我想這是不可能的。謝謝你們的幫助。

//編輯

顯然的boost :: shared_ptr的就是我一直在尋找。

回答

4

模板類型定義在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

這個答案是在它被寫的時間可能是正確的,但現在不是了。一個編輯可能會闡明這一點。 – 2016-03-10 05:57:28

0

C++不支持模板的typedef,所以template<typename T> typedef是非法的。

如果您可以使用C++ 11,則可以使用模板別名。我不太知道這是可能的memberfunction指針並不能保證語法是正確的,但我希望它是類似以下內容:

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

當然VS2010中可能不支持無論如何。

反正你的Nuke類沒有給出TFunctionPointer的類型,所以即使那個typedef在合法的地方,你試圖傳遞一個模板而不是一個具體類型,這是不可能的。

你可以換你的函數指針變成一個類型和使用properinstantiation:

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 2012-04-11 23:13:35