【发布时间】:2017-06-10 22:04:58
【问题描述】:
我一直在尝试使用 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(类 孩子::*)(int)'
如果我将 doThings() 的函数签名更改为采用常规 B 类型而不是通用引用,即
B 而不是 B&& 然后它编译运行没有问题。
我怀疑我的问题与我在 getInt() 中所做的演员表有关:
(void(child::*)(A))
但我不知道我需要将其更改为什么。 A&& 在这种情况下不起作用,因为我相信它会代表这种情况下的 r 值引用。我尝试时遇到的编译错误似乎证实了这一点:
错误:无法将‘int’左值绑定到‘int&&’
为了完整性:如果我不尝试执行强制转换,则会收到以下编译错误:
错误:没有匹配的函数调用'bind(未解决的重载 函数类型, child*, int)'
有人可以告诉我我需要做什么才能使我的 boost::bind 调用在这种情况下有效吗?
我正在使用 C++11
【问题讨论】:
-
您知道您将
int传递给doThings对吗? -
你可以使用带有 simpler 语法的 lambda:
[&](){ c.doThings(std::forward<A>(a));};. -
@Jonathan Mee 是的,这是个问题吗?我现在意识到 getInt 在这里是一个奇怪的名称选择 - 我一直在弄乱最后一个左右的各种排列,而函数与获取 int 无关的事实已经从我的想法中溜走了。该名称与此处的意图无关
-
有什么理由不做
c.getThings(std::forward<A>(a));?
标签: c++ c++11 templates boost universal-reference