2012-04-11 164 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