编译一段古老的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);