error C3867:非标准语法;请使用“&”来创建指向成员的指针

原因

类成员函数作为函数参数出现
例子:(类的部分代码)

//执行该语句报错
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

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值