2011-02-02 34 views
16

Tôi không thể tăng tốc :: multi_array thay đổi kích thước để hoạt động. Khi tôi thử nó, nó cho lỗi về std :: _ Copy_impl và tương tự. Đây là mãboost :: multi_array thay đổi kích thước không hoạt động

#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; 
} 

Edit: Đây là những lỗi

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

Thay thế 'mức độ [5] [6] 'với' boost :: mức độ [5] [6] 'trong cuộc gọi cho' resize'. –

+1

Không còn skrews lên. Tôi đang làm theo hướng dẫn/tài liệu về điều này. – Yelnats

+1

Cung cấp cho chúng tôi các lỗi thực tế. – GManNickG

Trả lời

7

Đây là tái sản xuất với VS10 (sử dụng các tiêu đề VS10 thích hợp) + tăng 1,44 và trong cấu hình debug (theo doc trong phiên bản cũ tăng cường là tốt).

Các giải pháp ngắn (until next c++ SP) là

#define _ITERATOR_DEBUG_LEVEL 0 

trước khi mọi thứ khác (đặc biệt là trước khi STL bao gồm).

Có nhiều giải pháp có thể phức tạp hơn - xem this chủ đề tương tự.

Cheers

+0

Cảm ơn nó đã hoạt động. – Yelnats

1

Một workaround, mà giải quyết vấn đề của tôi được thay thế

array_type multiarray; 

với

array_type* multiarray; 

và bất cứ khi nào bạn cần phải thay đổi kích thước mảng của bạn sử dụng

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

Một chủ đề hơi cũ, nhưng tôi thấy đây là một vấn đề với thậm chí VS 2010 và Boost 1.47.0 gần đây nhất. Đây thực ra là một vấn đề với Boost.MultiArray, thật khó tin, tôi biết!

Để khắc phục, chỉnh sửa tăng mã:

  • mở boost/multi_array/iterator.hpp
  • Replace xuất hiện đầu tiên của boost::random_access_traversal_tag (Tuyến 57 trong phiên bản 1.47.0)
    với std::random_access_iterator_tag
  • kiếm thứ hai (dòng 75) , thay thế toàn bộ typedef đó bằng

    typedef typename array_iterator::iterator_facade_ facade_type;

hth

+1

điều này được khắc phục trong phiên bản sắp tới (1.49.0), và sửa chữa ở trên tôi đề xuất không phải là khá an toàn. Vì vậy, hãy nâng cấp! – sly

+0

Phiên bản 1.49 có cùng vấn đề. –

Các vấn đề liên quan