次のように、含まれるオブジェクトにdeadline_timerがあり、外側のオブジェクトにハンドラー関数がある2層のオブジェクト構造があります。
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 &)' に変換できません」というメッセージが表示されます。
timer メンバーを public にして、同じ引数で直接呼び出すI.t.async_wait()
と成功します。QueueTick
明らかに、ハンドラーの署名は、宣言で使用したものよりも特別です。ただし、それを定義するシンボルが見つからず、basic_deadline_timer<>
テンプレート内で行われているメタプログラミングを解釈する方法がわかりません。