2013-01-24 48 views
1
#define UCHAR unsigned char 

typedef bool (*FUNC)(UCHAR uc1, UCHAR uc2); 
typedef void(*PF)(FUNC, UCHAR*); 
PF Assign; 

class Class { 
    private: 
     UCHAR buf[32]; 
     bool func(UCHAR c1, UCHAR c2) { } 

    public: 
     Class::Class(void) { 
      Assign(func, buf);   // <<< Microsoft VC++ error C3867 
     } 

     Class::~Class() { } 
}; 

error C3867: 'Class::func': function call missing argument list; use '&Class::func' to create a pointer to member的Visual C++错误C3867和C2664

如果我尝试了上述

Assign(&Class::func, buf); // <<< Microsoft VC++ error C2664

错误消息的建议,我得到这个错误:

error C2664: 'void (FUNC,unsigned char *)' : cannot convert parameter 1 from 'bool (__thiscall Class::*)(unsigned char,unsigned char)' to 'FUNC' There is no context in which this conversion is possible

在不改变任何东西怎么能我得到这个Assign()函数来编译? 这些类型定义来自我需要接口的库。

+0

永远不要这样做:'#定义UCHAR无符号char' - 始终使用一个typedef,例如'typedef unsigned char UCHAR;' –

回答

1

func是一个非静态成员函数,所以它的类型为bool (Class::*)(UCHAR, UCHAR),而Assign需要bool (*)(UCHAR, UCHAR)。您不能将非静态成员函数转换为非成员函数。

为了能够通过funcAssign,您必须使func静态。

1

类型别名FUNCPF不是成员函数指针,只能用于指向静态成员函数。原因是所有非静态成员函数都有指针this的隐式第一个参数。

如果需要通用功能“指针”你应该看看std::function

typedef std::function<bool(UCHAR uc1, UCHAR uc2)> FUNC; 
typedef std::function<void(FUNC, UCHAR*)> PF; 
PF Assign; 

Class::Class(void) { 
    Assign(std::bind(&Class::func, *this), buf); 
} 
+0

但是我不能修改第三部分库typedefs和PF Assign;线。如果我使func静态,那么我无法访问类变量。我得到这个错误:错误C2597:对非静态成员'Class :: buf'的非法引用 – user292344

+0

@ user292344如果'FUNC'和'PF'类型是第三方库的一部分,则应该在问题中声明。如果是这种情况,那么你需要重新考虑你的设计。 –