bind2nd
объявляется как:
template <class Fn, class T>
binder2nd<Fn> bind2nd(const Fn&, const T&);
Это означает, что тип T
выводится, в данном случае как Bar *
.
В моей системе это реализовано так:
template<typename _Operation, typename _Tp>
inline binder2nd<_Operation>
bind2nd(const _Operation& __fn, const _Tp& __x)
{
typedef typename _Operation::second_argument_type _Arg2_type;
return binder2nd<_Operation>(__fn, _Arg2_type(__x));
}
Чтобы понять, почему это скомпилируется, рассмотрим:
class Bar {};
int main() {
Bar *b = 0;
typedef const Bar& type;
const type t = type(b);
}
, которая кажется реальной проблемой и компилируется с g ++, потому что это в основном reinterpret_cast
.
Самый простой обходной путь - это использовать boost::bind
(или std::bind
для C ++ 11):
#include <boost/bind.hpp>
...
boost::bind(mem_fun(&Foo::tick), _1, &bar)
или лямбда-функция выводит ошибку, которую вы ожидаете увидеть.