dynamic_pointer_cast(result);

引数に含まれるUはresultから推論できるが、戻り値のTは推論できねえだろ。