C++函数指针报错

C++语言 码拜 8年前 (2016-05-12) 1541次浏览
以下代码用于测试函数指针,在不用类的时候可以正常调用函数指针,包装到类中编译时会报以下错:
error C3867: “CFuncPoint::max”: 函数调用缺少参数列表;请使用“&CFuncPoint::max”创建指向成员的指针
error C3867: “CFuncPoint::min”: 函数调用缺少参数列表;请使用“&CFuncPoint::min”创建指向成员的指针
假如按编译提示改成fp.calcValue(&CFuncPoint::max, 3, 4)和fp.calcValue(&CFuncPoint::min, 2, 5)的话又报以下错:
error C2664: “CFuncPoint::calcValue”: 不能将参数 1 从“int (__thiscall CFuncPoint::* )(int,int)”转换为“int (__cdecl *)(int,int)”
error C2664: “CFuncPoint::calcValue”: 不能将参数 1 从“int (__thiscall CFuncPoint::* )(int,int)”转换为“int (__cdecl *)(int,int)”
问一下该怎么将类的成员函数当成函数指针传递给其它函数?
//FuncPoint.h
class CFuncPoint
{
public:
int max(int a, int b);
int min(int a, int b);
void calcValue(int (*p)(int, int), int a, int b);
};
//FuncPoint.cpp
//函数指针测试

#include “FuncPoint.h”
#include <iostream>
int CFuncPoint::max(int a, int b)
{
printf(“a = %d, b = %d, max: “, a, b);
return a > b ? a : b;
}
int CFuncPoint::min(int a, int b)
{
printf(“a = %d, b = %d, min: “, a, b);
return a < b ? a : b;
}
void CFuncPoint::calcValue(int (*p)(int, int), int a, int b)
{
int rtn = p(a, b);
printf(“%d\n”, rtn);
}
void main(int argc, void* args[])
{
CFuncPoint fp;
fp.calcValue(fp.max, 3, 4);  // <–此处报错
fp.calcValue(fp.min, 2, 5);   // <–此处报错
getchar();
}
解决方案

35

成员函数指针和普通的函数指针有很大的不同, 是不能将成员函数指针当做普通函数指针来传递的.
普通的函数指针就是一个指针的大小, 32 位下是 4 个字节, 64 位下是 8 个字节. 而成员函数指针在 32 位下就可能是 4 个字节, 8 个字节, 16 个字节等等.
要把成员函数和普通函数统一处理, 最好是使用 C++11 的 std::function 和 std::bind, 假如环境不支持 C++11 就用 boost 库里的这两个库.

10

参考: http://www.adintr.com/mytranslate/fastdelegate.html

60

这个是原因是成员函数和函数指针处理的编译模式 不一样
一个是thiscall,一个是__cdecl
http://bbs.csdn.net/topics/390698897

5

//FuncPoint.h
class CFuncPoint
{
public:
int max(int a, int b);
int min(int a, int b);
void calcValue(int (CFuncPoint::*p)(int, int), int a, int b);
};
//FuncPoint.cpp
//函数指针测试
#include <iostream>
int CFuncPoint::max(int a, int b)
{
printf("a = %d, b = %d, max: ", a, b);
return a > b ? a : b;
}
int CFuncPoint::min(int a, int b)
{
printf("a = %d, b = %d, min: ", a, b);
return a < b ? a : b;
}
void CFuncPoint::calcValue(int (CFuncPoint::*p)(int, int), int a, int b)
{
int rtn = (this->*p)(a, b);
printf("%d\n", rtn);
}
void main(int argc, void* args[])
{
CFuncPoint fp;
fp.calcValue(&CFuncPoint::max, 3, 4);  // <--此处报错
fp.calcValue(&CFuncPoint::min, 2, 5);   // <--此处报错
getchar();
}

20

void calcValue(int (CFuncPoint:: *p)(int, int), int a, int b);

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明C++函数指针报错
喜欢 (0)
[1034331897@qq.com]
分享 (0)