c ++中函数指针的模板typedef

时间:2015-10-09 08:53:41

标签: c++ function templates pointers typedef

想象一下,我有一个模板类,我在其中定义了函数指针的typdedef到BaseClass函数,它返回T并且没有参数:

template <typename T, typename BaseClass> class TConnectionPoint
{
    typedef   T (BaseClass::* PConnectionFunction)();
    private:
       PConnectionFunction _func;
    public:
       T Call();
}

此模板的方法有Call():

template <typename T, typename BaseClass> T TConnectionPoint<T,BaseClass>::Call()
{
    return _func();
}

当我尝试执行Call()函数时出现问题 - VS2013发给我这个错误,这让我有些困惑:

  

术语不评估为采用0参数的函数

我做错了什么?

2 个答案:

答案 0 :(得分:1)

指向成员函数的指针只能与一个对象(将在其上调用该函数)一起取消引用。您需要访问BaseClass类型的对象才能使用它。

例如,您可以像这样更改Call()

template <typename T, typename BaseClass>
T TConnectionPoint<T,BaseClass>::Call(BaseClass &obj)
{
    return (obj.*_func)();
}

答案 1 :(得分:1)

typedef将PConnectionFunction定义为成员函数指针,而不是普通函数指针。您只能在对象上调用成员函数,如下所示:

template <typename T, typename BaseClass> 
T TConnectionPoint<T,BaseClass>::Call(BaseClass& b)
{
    return (b.*_func)();
}

如果您要调用 static 成员函数ob BaseClass,那么函数指针需要是普通函数指针,而不是成员函数指针:

typedef   T (* PConnectionFunction)();