原因
类成员函数作为函数参数出现
例子:(类的部分代码)
//执行该语句报错
cv::createTrackbar("smax(0-100(此时最大50)):", "灰度调节效果图", &smax, alpha_slider_max, this->on_trackbar_gray);
//类成员函数作为函数参数
void color_balance::on_trackbar_color(int, void*)
{
double ss_min = (double)(smin);
double ss_max = (double)(smax);
m_gImg = m_gImgSrc.clone();//深复制(重新开辟了内存,注意区分浅复制)
colorimg = m_gImg.data;; //输入/输出数据
size_t img_size = m_gImg.rows * m_gImg.cols;
//执行算法
colorimg = ColorBalanced(colorimg, img_size,
img_size * (ss_min / 100.0),
img_size * (ss_max / 100.0));
//显示图像
m_gImg.data = colorimg;
draw_hist(m_gImg);
imshow("彩色调节效果图", m_gImg);
}
分析:
这时候我们按照提示将 this->on_trackbar_gray前面加上&
会出现error C2276: “&”: 绑定成员函数表达式上的非法操作?
其实这里是因为类的成员函数默认带有一个this指针参数,那么它作为泛函的参数其实就不匹配了,因为泛函中的Func类型并没有this指针
- solution 1:我们可以把on_trackbar_color(int, void*)函数声明为静态(static)的,这样就不带有this指针;但是静态的函数又不能访问非静态的成员,像这里on_trackbar_color(int, void*)函数访问了非静态的成员变量m_gImg,m_gImgSrc,就会出错
- solution 2:如果这个函数是非静态成员函数,而且可以从类中提到类外,作为一个普通函数,这样就可以以正常的函数指针调用了。
- solution 3:如果这个函数不操作任何非静态的数据成员,那么就可以加static使之变成静态成员函数
- solution 4:通过一个友元函数,加一个间接层解决问题,具体参见blog.sina.com.cn/s/blog_4298002e0100euh8.html 。
- solution 5:通过boost::function和boost::bind,这个可以达到调用成员函数的目的,并不能解决此处的问题,因为最后function<void(int)>无法转换成void(*)(int)。具体可以参见stackoverflow.com/questions/3381829/how-do-i-implement-a-callback-in-c。
参考:
https://blog.csdn.net/this_capslock/article/details/17001003
https://blog.csdn.net/lmdyyh/article/details/19772485