我有一个两层对象结构,其中包含的对象有一个deadline_timer,外部对象有处理函数,如:
class Internal
{
asio::deadline_timer t;
public:
void QueueTick(void (*handler)(boost::system::error_code const&))
{
t.expires_from_now(posix_time::millisec(250));
t.async_wait(handler);
}
};
class ForClients
{
Internal I;
void OnTick(boost::system::error_code const&) { /*...*/ }
void Init()
{
I.QueueTick(boost::bind(&cdevXcite::OnTick, this, _1));
}
};
该QueueTick()
调用无法在 MSVS 2008 中编译,并显示“无法将参数 1 从 'boost::_bi::bind_t' 转换为 'void (__cdecl *)(const boost::system::error_code &)'”。
如果我公开计时器成员并使用相同的参数直接调用I.t.async_wait()
,它会成功。显然,处理程序的签名比我在QueueTick
声明中使用的更特殊;但是,我找不到定义它的符号,而且我不知道如何解释basic_deadline_timer<>
模板内正在进行的元编程。