2011-02-02 13 views
16

Non riesco a ottenere il boost :: ridimensionamento a più array per funzionare. Quando lo provo, dà degli errori su std :: _ Copy_impl e simili. Ecco il codiceboost :: ridimensionamento a più array non funziona

#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: Qui sono gli errori

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

Sostituire 'estensioni [5] [6]' con boost :: estensioni '[5] [6]' nella chiamata a 'resize'. –

+1

Non ci sono ancora rimbalzi. Sto seguendo il tutorial/documentazione su questo. – Yelnats

+1

Forniscici gli errori attuali. – GManNickG

risposta

7

Questo è riproducibile con VS10 (utilizzando le intestazioni VS10 propri) + EXTRA 1,44 e in configurazione di debug (in base al doc nelle vecchie versioni di spinta pure).

La breve soluzione (until next c++ SP) è quello di

#define _ITERATOR_DEBUG_LEVEL 0 

prima di tutto il resto (in particolare prima del STL include).

Ci sono soluzioni più complicate possibili - vedere il thread this simile.

Acclamazioni

+0

Grazie ha funzionato. – Yelnats

1

Un'altra soluzione, che ha risolto il mio problema è la sostituzione

array_type multiarray; 

con

array_type* multiarray; 

e ogni volta che è necessario ridimensionare l'array utilizzare

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

Un thread obsoleto, ma vedo che questo è un problema anche con il VS 2010 più recente e con Boost 1.47.0. Questo è in realtà un problema con Boost.MultiArray, difficile da credere, lo so!

Per fissare, modificare il codice spinta:

  • Aprire boost/multi_array/iterator.hpp
  • Sostituire prima occorrenza di boost::random_access_traversal_tag (linea 57 nella versione 1.47.0)
    con std::random_access_iterator_tag
  • Ricerca secondo (linea 75) , sostituire l'intero typedef con

    typedef typename array_iterator::iterator_facade_ facade_type;

hth

+1

questo problema è stato risolto nella prossima versione (1.49.0), e la correzione sopra suggerita non è abbastanza sicura. Quindi, per favore aggiorna! – sly

+0

La versione 1.49 ha lo stesso problema. –

Problemi correlati