It looks to me like there is a regression with multi_array in boost 1.42 using the MSVC10 RC.  The problem is when you assign a sub_array to an array.  This code works fine on MSVC9 and Intel 11.1 on windows.

Any easy patches that could fix this, or am I missing something?


#include <boost/multi_array.hpp>
int main(int argc, char* argv[]) 
{
boost::multi_array<double, 3> f_values(boost::extents[5][6][7]); //A boost::multidimensional object
boost::detail::multi_array::sub_array<double, 2> sub_f = f_values[2]; //Works
boost::multi_array<double, 2> sub_f2 = f_values[2]; //Fails, used to work
}
===============================
The error novel (ignoring the warning about unsafe iterators) is:

1>C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xutility(2216): error C2665: 'std::_Copy_impl' : none of the 2 overloads could convert all the argument types
1>          C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xutility(2182): could be '_OutIt std::_Copy_impl<_InIt,_OutIt>(_InIt,_InIt,_OutIt,std::input_iterator_tag,std::output_iterator_tag)'
1>          with
1>          [
1>              _OutIt=boost::detail::multi_array::array_iterator<double,double *,boost::mpl::size_t<2>,boost::detail::multi_array::sub_array<double,1>>,
1>              _InIt=boost::detail::multi_array::array_iterator<double,const double *,boost::mpl::size_t<2>,boost::detail::multi_array::const_sub_array<double,1>>
1>          ]
1>          C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xutility(2191): or       '_OutIt std::_Copy_impl<_InIt,_OutIt>(_InIt,_InIt,_OutIt,std::random_access_iterator_tag,std::random_access_iterator_tag)'
1>          with
1>          [
1>              _OutIt=boost::detail::multi_array::array_iterator<double,double *,boost::mpl::size_t<2>,boost::detail::multi_array::sub_array<double,1>>,
1>              _InIt=boost::detail::multi_array::array_iterator<double,const double *,boost::mpl::size_t<2>,boost::detail::multi_array::const_sub_array<double,1>>
1>          ]
1>          while trying to match the argument list '(boost::detail::multi_array::array_iterator<T,TPtr,NumDims,Reference>, boost::detail::multi_array::array_iterator<T,TPtr,NumDims,Reference>, boost::detail::multi_array::array_iterator<T,TPtr,NumDims,Reference>, boost::detail::iterator_category_with_traversal<Category,Traversal>, boost::detail::iterator_category_with_traversal<Category,Traversal>)'
1>          with
1>          [
1>              T=double,
1>              TPtr=const double *,
1>              NumDims=boost::mpl::size_t<2>,
1>              Reference=boost::detail::multi_array::const_sub_array<double,1>
1>          ]
1>          and
1>          [
1>              T=double,
1>              TPtr=const double *,
1>              NumDims=boost::mpl::size_t<2>,
1>              Reference=boost::detail::multi_array::const_sub_array<double,1>
1>          ]
1>          and
1>          [
1>              T=double,
1>              TPtr=double *,
1>              NumDims=boost::mpl::size_t<2>,
1>              Reference=boost::detail::multi_array::sub_array<double,1>
1>          ]
1>          and
1>          [
1>              Category=std::input_iterator_tag,
1>              Traversal=boost::random_access_traversal_tag
1>          ]
1>          and
1>          [
1>              Category=std::input_iterator_tag,
1>              Traversal=boost::random_access_traversal_tag
1>          ]
1>          C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xutility(2227) : see reference to function template instantiation '_OutIt std::_Copy_impl<_Iter,_OutIt>(_InIt,_InIt,_OutIt,std::tr1::false_type)' being compiled
1>          with
1>          [
1>              _OutIt=boost::detail::multi_array::array_iterator<double,double *,boost::mpl::size_t<2>,boost::detail::multi_array::sub_array<double,1>>,
1>              _Iter=boost::detail::multi_array::array_iterator<double,const double *,boost::mpl::size_t<2>,boost::detail::multi_array::const_sub_array<double,1>>,
1>              _InIt=boost::detail::multi_array::array_iterator<double,const double *,boost::mpl::size_t<2>,boost::detail::multi_array::const_sub_array<double,1>>
1>          ]
1>          C:\working\libraries\boost\boost/multi_array.hpp(337) : see reference to function template instantiation '_OutIt std::copy<boost::detail::multi_array::array_iterator<T,TPtr,NumDims,Reference>,boost::detail::multi_array::array_iterator<T,T *,NumDims,boost::detail::multi_array::sub_array<T,1>>>(_InIt,_InIt,_OutIt)' being compiled
1>          with
1>          [
1>              _OutIt=boost::detail::multi_array::array_iterator<double,double *,boost::mpl::size_t<2>,boost::detail::multi_array::sub_array<double,1>>,
1>              T=double,
1>              TPtr=const double *,
1>              NumDims=boost::mpl::size_t<2>,
1>              Reference=boost::detail::multi_array::const_sub_array<double,1>,
1>              _InIt=boost::detail::multi_array::array_iterator<double,const double *,boost::mpl::size_t<2>,boost::detail::multi_array::const_sub_array<double,1>>
1>          ]
1>          C:\working\libraries\boost\boost/multi_array.hpp(332) : while compiling class template member function 'boost::multi_array<T,NumDims>::multi_array(const boost::detail::multi_array::sub_array<T,2> &)'
1>          with
1>          [
1>              T=double,
1>              NumDims=2
1>          ]
1>          ..\test.cpp(14) : see reference to class template instantiation 'boost::multi_array<T,NumDims>' being compiled
1>          with
1>          [
1>              T=double,
1>              NumDims=2
1>          ]