2011-02-02 98 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