fix compilation adding a makeconst helper struct
diff --git a/Eigen/src/Core/Assign.h b/Eigen/src/Core/Assign.h
index 4bd1046..8dc0157 100644
--- a/Eigen/src/Core/Assign.h
+++ b/Eigen/src/Core/Assign.h
@@ -93,7 +93,7 @@
               ? ( int(MayUnrollCompletely) && int(DstIsAligned) ? int(CompleteUnrolling) : int(NoUnrolling) )
               : int(NoUnrolling)
   };
-  
+
   static void debug()
   {
     EIGEN_DEBUG_VAR(DstIsAligned)
diff --git a/Eigen/src/Core/Functors.h b/Eigen/src/Core/Functors.h
index ef4485f..259f402 100644
--- a/Eigen/src/Core/Functors.h
+++ b/Eigen/src/Core/Functors.h
@@ -350,7 +350,7 @@
   EIGEN_STRONG_INLINE Scalar operator() (const Scalar& a) const { return a * m_other; }
   EIGEN_STRONG_INLINE const PacketScalar packetOp(const PacketScalar& a) const
   { return ei_pmul(a, ei_pset1(m_other)); }
-  const typename NumTraits<Scalar>::Nested m_other;
+  typename ei_makeconst<typename NumTraits<Scalar>::Nested>::type m_other;
 private:
   ei_scalar_multiple_op& operator=(const ei_scalar_multiple_op&);
 };
@@ -364,7 +364,7 @@
   EIGEN_STRONG_INLINE ei_scalar_multiple2_op(const ei_scalar_multiple2_op& other) : m_other(other.m_other) { }
   EIGEN_STRONG_INLINE ei_scalar_multiple2_op(const Scalar2& other) : m_other(other) { }
   EIGEN_STRONG_INLINE result_type operator() (const Scalar1& a) const { return a * m_other; }
-  const typename NumTraits<Scalar2>::Nested m_other;
+  typename ei_makeconst<typename NumTraits<Scalar2>::Nested>::type m_other;
 };
 template<typename Scalar1,typename Scalar2>
 struct ei_functor_traits<ei_scalar_multiple2_op<Scalar1,Scalar2> >
@@ -393,7 +393,7 @@
   EIGEN_STRONG_INLINE ei_scalar_quotient1_impl(const ei_scalar_quotient1_impl& other) : m_other(other.m_other) { }
   EIGEN_STRONG_INLINE ei_scalar_quotient1_impl(const Scalar& other) : m_other(other) {}
   EIGEN_STRONG_INLINE Scalar operator() (const Scalar& a) const { return a / m_other; }
-  const typename NumTraits<Scalar>::Nested m_other;
+  typename ei_makeconst<typename NumTraits<Scalar>::Nested>::type m_other;
 };
 template<typename Scalar>
 struct ei_functor_traits<ei_scalar_quotient1_impl<Scalar,false> >
diff --git a/Eigen/src/Core/util/Memory.h b/Eigen/src/Core/util/Memory.h
index f8581ee..bc52355 100644
--- a/Eigen/src/Core/util/Memory.h
+++ b/Eigen/src/Core/util/Memory.h
@@ -83,7 +83,7 @@
     ei_assert(false && "heap allocation is forbidden (EIGEN_NO_MALLOC is defined)");
   #endif
 
-  void *result;  
+  void *result;
   #if !EIGEN_ALIGN
     result = malloc(size);
   #elif EIGEN_MALLOC_ALREADY_ALIGNED
@@ -97,7 +97,7 @@
   #else
     result = ei_handmade_aligned_malloc(size);
   #endif
-    
+
   #ifdef EIGEN_EXCEPTIONS
     if(result == 0)
       throw std::bad_alloc();
@@ -324,34 +324,34 @@
         typedef aligned_allocator<U> other;
     };
 
-    pointer address( reference value ) const 
+    pointer address( reference value ) const
     {
         return &value;
     }
 
-    const_pointer address( const_reference value ) const 
+    const_pointer address( const_reference value ) const
     {
         return &value;
     }
 
-    aligned_allocator() throw() 
+    aligned_allocator() throw()
     {
     }
 
-    aligned_allocator( const aligned_allocator& ) throw() 
+    aligned_allocator( const aligned_allocator& ) throw()
     {
     }
 
     template<class U>
-    aligned_allocator( const aligned_allocator<U>& ) throw() 
+    aligned_allocator( const aligned_allocator<U>& ) throw()
     {
     }
 
-    ~aligned_allocator() throw() 
+    ~aligned_allocator() throw()
     {
     }
 
-    size_type max_size() const throw() 
+    size_type max_size() const throw()
     {
         return std::numeric_limits<size_type>::max();
     }
@@ -362,24 +362,24 @@
         return static_cast<pointer>( ei_aligned_malloc( num * sizeof(T) ) );
     }
 
-    void construct( pointer p, const T& value ) 
+    void construct( pointer p, const T& value )
     {
         ::new( p ) T( value );
     }
 
-    void destroy( pointer p ) 
+    void destroy( pointer p )
     {
         p->~T();
     }
 
-    void deallocate( pointer p, size_type /*num*/ ) 
+    void deallocate( pointer p, size_type /*num*/ )
     {
         ei_aligned_free( p );
     }
-    
+
     bool operator!=(const aligned_allocator<T>& other) const
     { return false; }
-    
+
     bool operator==(const aligned_allocator<T>& other) const
     { return true; }
 };
diff --git a/Eigen/src/Core/util/Meta.h b/Eigen/src/Core/util/Meta.h
index 3a960be..2fdfd93 100644
--- a/Eigen/src/Core/util/Meta.h
+++ b/Eigen/src/Core/util/Meta.h
@@ -64,6 +64,13 @@
 template<typename T> struct ei_cleantype<const T*>  { typedef typename ei_cleantype<T>::type type; };
 template<typename T> struct ei_cleantype<T*>        { typedef typename ei_cleantype<T>::type type; };
 
+template<typename T> struct ei_makeconst            { typedef const T type;  };
+template<typename T> struct ei_makeconst<const T>   { typedef const T type;  };
+template<typename T> struct ei_makeconst<T&>        { typedef const T& type; };
+template<typename T> struct ei_makeconst<const T&>  { typedef const T& type; };
+template<typename T> struct ei_makeconst<T*>        { typedef const T* type; };
+template<typename T> struct ei_makeconst<const T*>  { typedef const T* type; };
+
 /** \internal Allows to enable/disable an overload
   * according to a compile time condition.
   */