error C3867: “ClassA::OnFuncA”: 函数调用缺少参数列表;请使用“&ClassA::OnFuncA”创建指向成员的指针

编译一段古老的VC6代码,发现一个类成员函数用作其他成员函数内部调用的参数的情况,会报错error C3867

原始代码如下

class TempalteBase
{
public:
  virtual HRESULT Call( int A, int B ) = 0;

  TempalteBase( UINT Id ) : m_TestID(Id) {
    //
  }
  UINT TestId() { return m_TestID; }

protected:
  UINT m_TestID;
};


template <class BASECLASS> class TemplateA : public TempalteBase {
public:
  typedef HRESULT (BASECLASS::*PFNMEMBERFUNCTION)( int A, int B );

  TemplateA( UINT Id, BASECLASS* pObject, PFNMEMBERFUNCTION pFunction  )
      : TempalteBase( Id ), m_pObject(pObject), m_pFunction(pFunction) {
    //
  }
  HRESULT Call( int A, int B ) {
    return (m_pObject->*m_pFunction)(A, B);
  }

protected:
  BASECLASS* m_pObject;
  PFNMEMBERFUNCTION m_pFunction;
};


class ClassA {
private:
public:
  ClassA() {
    TempalteBase* p = new TemplateA<ClassA>(123, this, OnFuncA);
    p->Call(11, 22);
  }
  ~ClassA();
public:
  HRESULT OnFuncA( int A, int B) {
    int a = A;
    int b = B;
    return 0;
  }
};

其中编译出错的一段代码是 

TempalteBase* p = new TemplateA<ClassA>(123, this, OnFuncA);

应该修改为

TempalteBase* p = new TemplateA<ClassA>(123, this, &ClassA::OnFuncA);
原文地址:https://www.cnblogs.com/cner/p/13331121.html