【问题标题】:Template typedef of function pointer in c++ [duplicate]c ++中函数指针的模板typedef [重复]
【发布时间】:2016-01-07 03:32:18
【问题描述】:

假设我有一个模板类,我在其中定义了指向 BaseClass 函数的函数指针的 typdedef,它返回 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 向我发送此错误,这让我有点困惑:

term 不计算为带 0 个参数的函数

我做错了什么?

【问题讨论】:

    标签: c++ function templates pointers typedef


    【解决方案1】:

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

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

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

    typedef   T (* PConnectionFunction)();
    

    【讨论】:

      【解决方案2】:

      指向成员函数的指针只能与对象(将在其上调用函数)结合使用。您需要访问BaseClass 类型的对象才能使用它。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-24
        • 1970-01-01
        • 1970-01-01
        • 2016-01-16
        相关资源
        最近更新 更多