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()  { }
};

错误 C3867:“Class::func”:函数调用缺少参数列表;使用 '&Class::func' 创建指向成员的指针

如果我尝试上面错误消息中的建议

赋值(&Class::func, buf); // <<< Microsoft VC++ 错误 C2664

我收到此错误:

错误 C2664: 'void (FUNC,unsigned char *)' : 无法将参数 1 从 'bool (__thiscall Class::* )(unsigned char,unsigned char)' 转换为 'FUNC' 没有可以进行此转换的上下文

在不更改任何其他内容的情况下,我如何才能编译此 Assign() 函数?这些 typedef 来自我需要与之交互的库。

4

2 回答 2

1

type-aliases并不是成员函数的指针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 );
}
于 2013-01-24T12:38:25.590 回答
1

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

为了能够传递funcAssign,您必须将其设为func静态。

于 2013-01-24T12:36:56.070 回答