我目前有一个问题,VS2010唠叨“Nuke”&的构造函数中使用的“TFunctionPointer”。因为datamember未定义。有人可以向我解释为什么会这样吗?非常感谢任何帮助。
template<typename T>
typedef void (T::* TFunctionPointer)();
class Nuke
{
public:
Nuke( TFunctionPointer pFunction );
virtual ~Nuke();
private:
TFunctionPointer m_pFunction;
};
//编辑
我要做的是允许存储任何类型的类的函数指针,并在销毁Nuke对象时调用它。对RAII的一种扭曲。但我想这是不可能的。谢谢你的帮助。
//编辑
显然我正在寻找Boost :: shared_ptr。
答案 0 :(得分:4)
模板typedef在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;
};
答案 1 :(得分:0)
C ++不支持模板typedef,因此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;
};