ALE::move in c++ running error

I use c++ to implement the ALE::Move. However, I met the following error:

*** Error: Unable to set/get mesh geometry coordinates from/to function.
*** Reason: function has incorrect value rank 0, need 1.
*** Where: This error was encountered inside fem_utils.cpp.
*** Process: 0

If possible, could you please tell me what is wrong? Thank you so much!

The original code is here:
#include <dolfin.h>
#include “OneDfreeboundary.h”
#include “OneDfreeboundary_velocity.h”

using namespace dolfin;

// Source term (right-hand side)
class Source : public Expression
{
void eval(Array& values, const Array& x) const
{
values[0] = exp(x[0]-1.0);
}
};

// Normal derivative (Neumann boundary condition)
class dUdN : public Expression
{
void eval(Array& values, const Array& x) const
{
values[0] = 0.0;
}
};

// Sub domain for Dirichlet boundary condition
class DirichletBoundary : public SubDomain
{
bool inside(const Array& x, bool on_boundary) const
{
return x[0] > 1.0 - DOLFIN_EPS and on_boundary;
}
};

int main()
{
// Create mesh and function space
auto mesh = std::make_shared (40, 0, 1.0);
auto Q = std::make_sharedOneDfreeboundary::FunctionSpace(mesh);
auto V = std::make_shared<OneDfreeboundary_velocity::FunctionSpace>(mesh);

auto p0 = std::make_shared(1.0);
auto boundary = std::make_shared();

DirichletBC bc(Q, p0, boundary);
std::vector <DirichletBC*> bcp = {&bc};

//create function
auto p1 = std::make_shared (Q);
auto u1 = std::make_shared (V);
auto delta_u = std::make_shared (V);

// Define variational forms
OneDfreeboundary::BilinearForm a1(Q, Q);
OneDfreeboundary::LinearForm L1(Q);
OneDfreeboundary_velocity::BilinearForm a2(V, V);
OneDfreeboundary_velocity::LinearForm L2(V);

auto f = std::make_shared();
L1.f = f; L2.p1 = p1;

Matrix A1, A2;
assemble(A1, a1);
assemble(A2, a2);

// Compute solution
File file(“OneDfreeboundary.pvd”);
double dt = 0.05;
double t = 0;

Vector b1, b2;
const std::string prec(has_krylov_solver_preconditioner(“amg”) ? “amg” : “default”);

for (unsigned k=0; k<10; k++){
t += dt;
begin(“computating poission equation”);
assemble(b1, L1);
for (std::size_t i = 0; i < bcp.size(); i++) bcp[i]-> apply(A1,b1);
solve(A1, *p1->vector(), b1, “gmres”, “default”);
end();

begin("computing velocity");
assemble(b2, L2);
solve(A2, *u1->vector(), b2, "gmres", "default");
end();

*(delta_u->vector())  = *(u1->vector()); 
*(delta_u->vector()) *= dt;  
ALE::move(*mesh, *delta_u);
file << *p1;

}
return 0;
}