Подтвердить что ты не робот

Boost:: multi_array изменение размера не работает

Я не могу получить boost:: multi_array изменение размера для работы. Когда я пытаюсь, он дает ошибки о std:: _ Copy_impl и т.п. Вот код

#include <boost/multi_array.hpp>

typedef boost::multi_array<int, 2> array_type;

class arrayclass{
public:
    arrayclass(array_type::extent_gen extents)
        : multiarray(extents[3][4]){
    }
    array_type multiarray;
};

int main(){
    array_type::extent_gen extents;
    arrayclass arraytest(extents);
    arraytest.multiarray.resize(extents[5][6]);
    return 0;
}

Изменить: Вот ошибки

1>------ Build started: Project: multiarray, Configuration: Debug Win32 ------
1>  main.cpp
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<int,int *,boost::mpl::size_t<2>,boost::detail::multi_array::sub_array<int,1>>,
1>              _InIt=boost::detail::multi_array::array_iterator<int,const int *,boost::mpl::size_t<2>,boost::detail::multi_array::const_sub_array<int,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<int,int *,boost::mpl::size_t<2>,boost::detail::multi_array::sub_array<int,1>>,
1>              _InIt=boost::detail::multi_array::array_iterator<int,const int *,boost::mpl::size_t<2>,boost::detail::multi_array::const_sub_array<int,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=int,
1>              TPtr=const int *,
1>              NumDims=boost::mpl::size_t<2>,
1>              Reference=boost::detail::multi_array::const_sub_array<int,1>
1>          ]
1>          and
1>          [
1>              T=int,
1>              TPtr=const int *,
1>              NumDims=boost::mpl::size_t<2>,
1>              Reference=boost::detail::multi_array::const_sub_array<int,1>
1>          ]
1>          and
1>          [
1>              T=int,
1>              TPtr=int *,
1>              NumDims=boost::mpl::size_t<2>,
1>              Reference=boost::detail::multi_array::sub_array<int,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<int,int *,boost::mpl::size_t<2>,boost::detail::multi_array::sub_array<int,1>>,
1>              _Iter=boost::detail::multi_array::array_iterator<int,const int *,boost::mpl::size_t<2>,boost::detail::multi_array::const_sub_array<int,1>>,
1>              _InIt=boost::detail::multi_array::array_iterator<int,const int *,boost::mpl::size_t<2>,boost::detail::multi_array::const_sub_array<int,1>>
1>          ]
1>          c:\boost_1_45_0\boost\multi_array\view.hpp(321) : 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<int,int *,boost::mpl::size_t<2>,boost::detail::multi_array::sub_array<int,1>>,
1>              T=int,
1>              TPtr=const int *,
1>              NumDims=boost::mpl::size_t<2>,
1>              Reference=boost::detail::multi_array::const_sub_array<int,1>,
1>              _InIt=boost::detail::multi_array::array_iterator<int,const int *,boost::mpl::size_t<2>,boost::detail::multi_array::const_sub_array<int,1>>
1>          ]
1>          c:\boost_1_45_0\boost\multi_array\view.hpp(313) : while compiling class template member function 'boost::detail::multi_array::multi_array_view<T,NumDims> &boost::detail::multi_array::multi_array_view<T,NumDims>::operator =(const boost::detail::multi_array::multi_array_view<T,NumDims> &)'
1>          with
1>          [
1>              T=int,
1>              NumDims=2
1>          ]
1>          c:\badprogramer\multiarray\multiarray\main.cpp(7) : see reference to class template instantiation 'boost::detail::multi_array::multi_array_view<T,NumDims>' being compiled
1>          with
1>          [
1>              T=int,
1>              NumDims=2
1>          ]
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
4b9b3361

Ответ 1

Это воспроизводится с VS10 (с использованием соответствующих заголовков VS10) + boost 1.44 и в конфигурации отладки (в соответствии с doc в более старых версиях boost).

Короткое временное решение (до следующего С++ SP) означает

#define _ITERATOR_DEBUG_LEVEL 0

перед всем остальным (особенно перед включением STL).

Есть более сложные возможные решения - см. этот аналогичный поток.

Приветствия

Ответ 2

Немного устаревший поток, но я вижу, что это проблема даже с самыми последними версиями VS 2010 и Boost 1.47.0. На самом деле это проблема с Boost.MultiArray, которую трудно поверить, я знаю!

Чтобы исправить, отредактируйте код повышения:

  • Открыть boost/multi_array/iterator.hpp
  • Заменить первое вхождение boost::random_access_traversal_tag (строка 57 в версии 1.47.0)
    с std::random_access_iterator_tag
  • Искать второй (строка 75), замените весь этот typedef на

    typedef typename array_iterator::iterator_facade_ facade_type;

HTH

Ответ 3

Другим обходным решением, которое решило мою проблему, является замена

array_type multiarray;

с

array_type* multiarray;

и всякий раз, когда вам нужно изменить размер массива, используйте

delete arraytest.multiarray;
arraytest.multiarray = new array_type(extents[5][6]);