2011-02-02 8 views
16

No puedo obtener boost :: multi_array resizing para que funcione. Cuando lo intento, da errores sobre std :: _ Copy_impl y similares. Aquí está el códigoboost :: multi_array resize no funciona

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

Editar: Estos son los errores

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

Reemplazar 'extensiones [5] [6]' 'con el impulso :: extensiones [5] [6] 'en la llamada a' resize'. –

+1

Aún no se ha escatimado. Estoy siguiendo el tutorial/documentación sobre este. – Yelnats

+1

Danos los errores reales. – GManNickG

Respuesta

7

Esto es reproducible con VS10 (usando las cabeceras VS10 apropiados) + impulsar 1.44 y en configuración de depuración (de acuerdo con doc en las versiones anteriores de impulso también).

La solución a corto (until next c++ SP) es

#define _ITERATOR_DEBUG_LEVEL 0 

antes de todo lo demás (en concreto antes de STL incluye).

Existen soluciones más complicadas posibles - vea this similar thread.

Saludos

+0

Gracias funcionó. – Yelnats

1

Otra solución, que resolvió mi problema es la sustitución

array_type multiarray; 

con

array_type* multiarray; 

y cada vez que necesite cambiar el tamaño de la matriz de usar

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

Un hilo obsoleto, pero veo que este es un problema incluso con el VS 2010 y el Boost 1.47.0 más recientes. De hecho, este es un problema con Boost.MultiArray, ¡difícil de creer, lo sé!

Para el montaje, editar código de impulso:

  • abierto boost/multi_array/iterator.hpp
  • Reemplazar primera aparición de boost::random_access_traversal_tag (línea 57 en la versión 1.47.0)
    con std::random_access_iterator_tag
  • Búsqueda segundo (línea 75) , reemplace ese typedef completo con

    typedef typename array_iterator::iterator_facade_ facade_type;

hth

+1

esto se soluciona en la próxima versión (1.49.0), y la solución anterior que sugiero no es del todo segura. Por lo tanto, por favor actualice! – sly

+0

La versión 1.49 tiene el mismo problema. –

Cuestiones relacionadas