模板成员函数指针

Template Member Function Pointers

本文关键字:指针 函数 成员      更新时间:2023-10-16

我目前有一个问题,VS2010 唠叨说"Nuke"的构造函数中使用的"TFunctionPointer"和作为数据成员是未定义的。有人可以向我解释为什么会这样吗?任何帮助都非常感谢。

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

//编辑

我试图做的是允许存储指向任何类型的类的函数指针,并在销毁Nuke对象时调用。雷伊的转折。但我想这是不可能的。谢谢你们的帮助。

//编辑

显然,Boost::shared_ptr 是我想要的。

模板类型定义在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;
};
C++不支持

模板typedefs,因此template<typename T> typedef是非法的。

如果可以使用 C++11,则可以使用模板别名。我不太确定成员函数指针是否可以做到这一点,并且不能保证语法正确,但我希望它如下所示:

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

当然,VS2010可能不支持这一点。

无论如何,您的Nuke类不会为TFunctionPointer提供类型,因此即使该typedef合法,您也尝试传递模板而不是具体类型,这是不可能的。

您可以将函数指针包装到类型中并使用适当的实例化:

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;
};