2011-02-02 69 views
16

我无法获得boost :: multi_array调整大小的工作。当我尝试它时,它会给std :: _ Copy_impl之类的错误。下面是代码boost :: multi_array resize不起作用

#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 ========== 
+1

替换`区段[5] [6]``与升压::区段[5] [6]`在调用`resize`。 – 2011-02-02 02:27:46

+1

还没有起来。我正在关注这个教程/文档。 – Yelnats 2011-02-02 02:57:00

+1

给我们提供实际的错误。 – GManNickG 2011-02-02 03:52:45

回答

7

这是可重复使用VS10(使用正确的VS10头)+提高1.44和调试配置(根据旧版本文档也是助推)。

短的解决方法(until next c++ SP)是

#define _ITERATOR_DEBUG_LEVEL 0 

一切(STL具体包括之前)。

还有更复杂的可能解决方案 - 请参阅this类似的线程。

干杯

1

另一个解决办法,是解决我的问题与

array_type* multiarray; 

更换

array_type multiarray; 

,每当你需要调整你的阵列使用

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

有点陈旧的线程,但我发现即使是最近的VS 2010和Boost 1.47.0也是如此。这实际上是Boost.MultiArray的一个问题,很难相信,我知道!

要修复,编辑升压代码:

  • 打开boost/multi_array/iterator.hpp
  • 更换(在1.47.0版的57号线)
    std::random_access_iterator_tag
  • 搜索第二(线75)的boost::random_access_traversal_tag首次出现,用

    替换整个typedef

    typedef typename array_iterator::iterator_facade_ facade_type;

HTH