将带两个参数的类成员函数传递给boost bind时模板参数推导失败的问题
将带两个参数的类成员函数传递给boost bind时模板参数推导失败的问题
嗨,我来帮你捋捋这个问题~你遇到的是Boost.Bind 1.63版本里的一个小坑:当绑定带有左值引用的复杂嵌套模板类型参数的类成员函数时,模板推导机制会“卡壳”。
先看你的代码场景:类A的成员函数f第一个参数是boost::shared_ptr<boost::array<unsigned char, 128>>&(非const左值引用),你用boost::bind(&A::f, &myA, _1, _2)绑定的时候,Boost.Bind没办法自动推导这个复杂的引用类型,导致找不到匹配的内部调用重载,最后落到了你贴出来的那个兜底operator()模板里,直接触发编译报错。
给你几个实用的解决办法:
- 显式指定bind的返回值模板参数:直接告诉编译器返回值类型是
bool,跳过自动推导的环节,代码改成这样:
这个方法最简单直接,完全不用修改原有成员函数的签名。boost::bind<bool>(&A::f, &myA, _1, _2); - 把成员函数的参数改成const左值引用:如果你的业务逻辑允许(函数内部不需要修改这个shared_ptr的话),把
f的签名调整为:
const引用的模板推导兼容性要好很多,Boost.Bind能正确识别参数类型,不用额外指定模板参数就能正常绑定。bool f(const boost::shared_ptr<boost::array<unsigned char, 128>>&, size_t);
你贴出来的那个operator()是Boost.Bind内部的兜底调用模板,当它推导不出正确的函数返回值或参数类型时,就会匹配到这个重载,而此时参数类型完全不匹配,自然就报出模板推导失败的错误了。
备注:内容来源于stack exchange,提问作者minsuk ji
相关产品推荐
相关产品推荐

