diff --git a/include/eigenpy/eigen-allocator.hpp b/include/eigenpy/eigen-allocator.hpp
index edf89dd5747fff21d948e4e7b4986c363f419792..b4397d90f96fa30ea9d852f4daf543609110bb08 100644
--- a/include/eigenpy/eigen-allocator.hpp
+++ b/include/eigenpy/eigen-allocator.hpp
@@ -344,7 +344,6 @@ struct eigen_allocator_impl_tensor {
   /// \brief Copy Python array into the input matrix mat.
   template <typename TensorDerived, int AccessLevel>
   static void copy(
-      PyArrayObject *pyArray,
       const Eigen::TensorBase<TensorDerived, AccessLevel> &tensor_) {
     TensorDerived &tensor = const_cast<TensorDerived &>(
         static_cast<const TensorDerived &>(tensor_));
@@ -649,14 +648,15 @@ struct eigen_allocator_impl_tensor_ref {
 
     void *raw_ptr = storage->storage.bytes;
     if (need_to_allocate) {
-      TensorType *tensor_ptr;
-      tensor_ptr = details::init_tensor<TensorType>::run(pyArray);
+      typedef typename boost::remove_const<TensorType>::type TensorTypeNonConst;
+      TensorTypeNonConst *tensor_ptr;
+      tensor_ptr = details::init_tensor<TensorTypeNonConst>::run(pyArray);
       RefType tensor_ref(*tensor_ptr);
 
       new (raw_ptr) StorageType(tensor_ref, pyArray, tensor_ptr);
 
-      RefType &tensor = *reinterpret_cast<RefType *>(raw_ptr);
-      EigenAllocator<TensorType>::copy(pyArray, tensor);
+      TensorTypeNonConst &tensor = *tensor_ptr;
+      EigenAllocator<TensorTypeNonConst>::copy(pyArray, tensor);
     } else {
       assert(pyArray_type_code == Scalar_type_code);
       typename NumpyMap<TensorType, Scalar, Options>::EigenMap numpyMap =