调用成员函数指针失败
调用成员函数指针失败,求救
VS2008在编译时报错,这个问题困扰我好久了,请大家帮忙:
方式一错误信息
error C2440: 'type cast' : cannot convert from 'void (__cdecl CDimChange::* )(char *,char *,ProAppData)' to 'ProUIAction'
1> There is no context in which this conversion is possible
方式二:
error C2440: 'type cast' : cannot convert from 'overloaded-function' to 'ProUIAction'
1> None of the functions with this name in scope match the target type
方式三:
error C3867: 'CDimChange::SelFilterMenuAction': function call missing argument list; use '&CDimChange::SelFilterMenuAction' to create a pointer to member
------解决思路----------------------
方法1: 声明类成员函数为静态, 并传入实例指针
方法2: 声明类成员函数为静态, 并声明使用到的成员为静态
方法3: 声明类成员函数为静态, 声明类实例为全局静态
方法4: 使用uion强制转换, 但在调用时要保证传入ecx 为实例指针
//类定义
class CDimChange
{
public:
CDimChange(void);
~CDimChange(void);
public:
void InitializeDialog();
public:
void SelFilterMenuAction(char* dialog, char* component, ProAppData appdata);
}
//void InitializeDialog()函数
void(CDimChange::*pSelFilterMenuAction)(char*, char*, ProAppData)=&CDimChange::SelFilterMenuAction;
void CDimChange::InitializeDialog()
{
ProError err;
//调用方式一
err=ProUIOptionmenuSelectActionSet(cDialogName,cOptMenuName,
(ProUIAction)pSelFilterMenuAction,&ChgData);
//调用方式二
err=ProUIOptionmenuSelectActionSet(cDialogName,cOptMenuName,
(ProUIAction)SelFilterMenuAction,&ChgData);
//或
err=ProUIOptionmenuSelectActionSet(cDialogName,cOptMenuName,
(ProUIAction)CDimChange::SelFilterMenuAction,&ChgData);
//调用方式三
err=ProUIOptionmenuSelectActionSet(cDialogName,cOptMenuName,
CDimChange::SelFilterMenuAction,&ChgData);
}
//ProUIAction定义,不能修改
typedef void (*ProUIAction)(
char* dialog,
char *component,
ProAppData appdata);
//函数原型
extern ProError ProUIOptionmenuSelectActionSet(
char* dialog,
char* optionmenu,
ProUIAction action,
ProAppData appdata);
VS2008在编译时报错,这个问题困扰我好久了,请大家帮忙:
方式一错误信息
error C2440: 'type cast' : cannot convert from 'void (__cdecl CDimChange::* )(char *,char *,ProAppData)' to 'ProUIAction'
1> There is no context in which this conversion is possible
方式二:
error C2440: 'type cast' : cannot convert from 'overloaded-function' to 'ProUIAction'
1> None of the functions with this name in scope match the target type
方式三:
error C3867: 'CDimChange::SelFilterMenuAction': function call missing argument list; use '&CDimChange::SelFilterMenuAction' to create a pointer to member
------解决思路----------------------
方法1: 声明类成员函数为静态, 并传入实例指针
public:
static void SelFilterMenuAction(char* dialog, char* component, ProAppData appdata, CDimChange* instance )
{
instance ->a = 10; // 如此使用类成员
// ....
}
// 这里同样修改
typedef void (*ProUIAction)( char* dialog, char *component, ProAppData appdata, CDimChange* instance );
方法2: 声明类成员函数为静态, 并声明使用到的成员为静态
public:
static int a; // 声明使用到的成员为静态
static void SelFilterMenuAction(char* dialog, char* component, ProAppData appdata)
{
CDimChange::a = 10; // 如此使用类成员
// ....
}
方法3: 声明类成员函数为静态, 声明类实例为全局静态
class CDimChange;
CDimChange* g_CDC;
class CDimChange
{
//.....
static void SelFilterMenuAction(char* dialog, char* component, ProAppData appdata)
{
g_CDC->a = 10; // 如此使用类成员
// ....
}
}
方法4: 使用uion强制转换, 但在调用时要保证传入ecx 为实例指针
//ProUIAction定义,不能修改
typedef void (*ProUIAction)(
char* dialog,
char *component,
ProAppData appdata);
void(CDimChange::*pSelFilterMenuAction)(char*, char*, ProAppData)=&CDimChange::SelFilterMenuAction;
void CDimChange::InitializeDialog()
{
union
{
void(CDimChange::* a)(char*, char*, ProAppData);
ProUIAction b;
];
a = pSelFilterMenuAction; // 使用uion强制转换
ProError err;
//调用方式一
err=ProUIOptionmenuSelectActionSet(cDialogName,cOptMenuName,
b,&ChgData);
}
extern ProError ProUIOptionmenuSelectActionSet(
char* dialog,
char* optionmenu,
ProUIAction action,
ProAppData appdata)
{
CDimChange* a;
__asm{ // 传入ecx 为实例指针
push 其它参数
mov ecx, a;
call action;
};
}