我一直在尝试使用 boost::bind 将对成员函数的调用发布到 io_strand 但一直出错。我已经设法为我正在尝试做的事情创建一个简单的等效示例,并且在以下上下文中看到了相同的错误:
我有以下包含我要调用的 doThings() 成员函数的类:
class base
{
public:
int x = 1;
template<typename B>
void doThings(B&& b)
{}
};
然后有一个子类(以准确表示我遇到错误的场景 - 我认为这没有区别)
class child : public base
{
int y = 2;
};
我有以下代码试图进行 boost::bind 调用:
template<typename A>
void getInt(child c, A&& a)
{
boost::bind((void(child::*)(A)) &child::doThings, &c, std::forward<A>(a))();
}
然后调用如下:
int main()
{
child c = child();
getInt(c, 7);
}
当我编译上面的代码时,我得到以下错误:
错误:没有匹配将函数“doThings”转换为类型“void (class child::*)(int)”</p>
如果我将 doThings() 的函数签名更改为采用常规 B 类型而不是通用引用,即
B
,B&&
它编译运行没有问题。
我怀疑我的问题与我在 getInt() 中所做的演员表有关:
(void(child::*)(A))
但我不知道我需要将其更改为什么。A&&
在这种情况下不起作用,因为我相信它会在那种情况下代表 r 值引用。我尝试时遇到的编译错误似乎证实了这一点:
错误:无法将“int”左值绑定到“int&&”</p>
为了完整性:如果我不尝试执行强制转换,那么我会收到以下编译错误:
错误:没有匹配的函数调用'bind(未解决的重载函数类型,child*,int)'</p>
有人可以告诉我我需要做什么才能使我的 boost::bind 调用在这种情况下有效吗?
我正在使用 C++11