0

我目前有一个问题,VS2010 唠叨在“Nuke”的构造函数中使用的“TFunctionPointer”作为数据成员是未定义的。有人可以向我解释这是为什么吗?很感谢任何形式的帮助。

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

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

private:
    TFunctionPointer m_pFunction;

};

// 编辑

我想要做的是允许在销毁 Nuke 对象时存储和调用任何类型的类的函数指针。RAII 的一个转折点。但我想这是不可能的。谢谢你们的帮助。

// 编辑

显然 Boost::shared_ptr 是我正在寻找的。

4

2 回答 2

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;
};
于 2012-04-11T22:47:51.170 回答
1

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

};
于 2012-04-11T22:48:47.267 回答