У меня есть двухуровневая структура объекта, в которой содержащийся объект имеет 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<>
.