¿Por qué mi compilador de C ++ no puede deducir el argumento de plantilla para la función de impulso?

Defino un método como este:

template <class ArgT>
void foo(ArgT arg, ::boost::function< void(ArgT) > func)
{
    func(arg);
}

y úselo de esta manera, por ejemplo:

foo(2, [](int i) -> void { cout << i << endl; });

Por qué el compilador no puede deducir el tipo ya que definitivamente es unint?

Yo obtengo'void foo(ArgT,boost::function<void(ArgT)>)' : could not deduce template argument for 'boost::function<void(ArgT)>' from 'anonymous-namespace'::<lambda0>'.

Respuestas a la pregunta(2)

Su respuesta a la pregunta