视觉C++错误 C3867 和 C2664

Visual C++ errors C3867 and C2664

本文关键字:C2664 C3867 错误 C++ 视觉      更新时间:2023-10-16
#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:"类::func":函数调用缺少参数列表; 使用 '&Class::func' 创建指向成员的指针

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

Assign( &Class::func, buf ); <<

我收到此错误:

错误 C2664:"无效(FUNC,无符号字符 *)":无法转换 参数 1 来自 'bool (__thiscall Class::*)(无符号字符,无符号字符)' 到"FUNC" 没有上下文可以进行此转换

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

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

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

类型别名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 );
}