Template, Error im Debug-Mode
-
Hallo!
Ich hab hier einen Code, der mit GCC compiliert, und auch mit VS2010 im Release-Mode. VS2010 im Debug-Mode verweigert aber:
Klasse HCube:
#include "FSM.h" class HCube:public FSM<HCube,void> { ..bla... }Klasse FSM:
template<class T_DERIVED,class T_RET> class FSM { typedef T_RET(T_DERIVED::*mtdPtr)(); typedef typename boost::multi_array<mtdPtr ,2> fptrArrayType; typedef typename boost::multi_array<unsigned,2> nextStateArrayType; protected: FSM(unsigned dimX_,unsigned dimY_); void setEntry(unsigned state, unsigned event,mtdPtr,unsigned nextState); void runFSM(unsigned initState,unsigned initEvent); void init(unsigned initState); unsigned getState() const; virtual T_RET inv()=0; virtual ~FSM(); virtual string userFriendlyState(unsigned st) const=0; virtual string userFriendlyEvent(unsigned ev) const=0; unsigned dimX,dimY; unsigned currentState; fptrArrayType fpntTab; // DAS IST ZEILE 17, HIER IST ETWAS FAUL nextStateArrayType nextStateTab; };Hier ist die lange Fehlermeldung, die seit dem Upgrade auf Boost 1.49.0 (und nur Im Debug-Mode) auftritt:
1> HCube.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<unsigned int,unsigned int *,boost::mpl::size_t<0x02>,boost::detail::multi_array::sub_array<unsigned int,0x01>>, 1> _InIt=boost::detail::multi_array::array_iterator<unsigned int,const unsigned int *,boost::mpl::size_t<0x02>,boost::detail::multi_array::const_sub_array<unsigned int,0x01>> 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<unsigned int,unsigned int *,boost::mpl::size_t<0x02>,boost::detail::multi_array::sub_array<unsigned int,0x01>>, 1> _InIt=boost::detail::multi_array::array_iterator<unsigned int,const unsigned int *,boost::mpl::size_t<0x02>,boost::detail::multi_array::const_sub_array<unsigned int,0x01>> 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=unsigned int, 1> TPtr=const unsigned int *, 1> NumDims=boost::mpl::size_t<0x02>, 1> Reference=boost::detail::multi_array::const_sub_array<unsigned int,0x01> 1> ] 1> and 1> [ 1> T=unsigned int, 1> TPtr=const unsigned int *, 1> NumDims=boost::mpl::size_t<0x02>, 1> Reference=boost::detail::multi_array::const_sub_array<unsigned int,0x01> 1> ] 1> and 1> [ 1> T=unsigned int, 1> TPtr=unsigned int *, 1> NumDims=boost::mpl::size_t<0x02>, 1> Reference=boost::detail::multi_array::sub_array<unsigned int,0x01> 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<unsigned int,unsigned int *,boost::mpl::size_t<0x02>,boost::detail::multi_array::sub_array<unsigned int,0x01>>, 1> _Iter=boost::detail::multi_array::array_iterator<unsigned int,const unsigned int *,boost::mpl::size_t<0x02>,boost::detail::multi_array::const_sub_array<unsigned int,0x01>>, 1> _InIt=boost::detail::multi_array::array_iterator<unsigned int,const unsigned int *,boost::mpl::size_t<0x02>,boost::detail::multi_array::const_sub_array<unsigned int,0x01>> 1> ] 1> C:\windev64\otherLib\boost_1_49_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,0x01>>>(_InIt,_InIt,_OutIt)' being compiled 1> with 1> [ 1> _OutIt=boost::detail::multi_array::array_iterator<unsigned int,unsigned int *,boost::mpl::size_t<0x02>,boost::detail::multi_array::sub_array<unsigned int,0x01>>, 1> T=unsigned int, 1> TPtr=const unsigned int *, 1> NumDims=boost::mpl::size_t<0x02>, 1> Reference=boost::detail::multi_array::const_sub_array<unsigned int,0x01>, 1> _InIt=boost::detail::multi_array::array_iterator<unsigned int,const unsigned int *,boost::mpl::size_t<0x02>,boost::detail::multi_array::const_sub_array<unsigned int,0x01>> 1> ] 1> C:\windev64\otherLib\boost_1_49_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=unsigned int, 1> NumDims=0x02 1> ] 1> C:\windev64\otherLib\boost_1_49_0\boost/multi_array.hpp(406) : see reference to class template instantiation 'boost::detail::multi_array::multi_array_view<T,NumDims>' being compiled 1> with 1> [ 1> T=unsigned int, 1> NumDims=0x02 1> ] 1> C:\windev64\otherLib\boost_1_49_0\boost/multi_array.hpp(402) : while compiling class template member function 'boost::multi_array<T,NumDims> &boost::multi_array<T,NumDims>::resize(const boost::detail::multi_array::extent_gen<NumRanges> &)' 1> with 1> [ 1> T=unsigned int, 1> NumDims=0x02, 1> NumRanges=0x02 1> ] 1> c:\windev64\mergelib\FSM.h(38) : see reference to class template instantiation 'boost::multi_array<T,NumDims>' being compiled 1> with 1> [ 1> T=unsigned int, 1> NumDims=0x02 1> ] 1> c:\windev64\mergelib\FSM.h(39) : see reference to class template instantiation 'FSM<T_DERIVED,T_RET>' being compiled 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<void (__cdecl HCube::* )(void),void (__cdecl HCube::* *)(void),boost::mpl::size_t<0x02>,boost::detail::multi_array::sub_array<void (__cdecl HCube::* )(void),0x01>>, 1> _InIt=boost::detail::multi_array::array_iterator<void (__cdecl HCube::* )(void),void (__cdecl HCube::* const *)(void),boost::mpl::size_t<0x02>,boost::detail::multi_array::const_sub_array<void (__cdecl HCube::* )(void),0x01>> 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<void (__cdecl HCube::* )(void),void (__cdecl HCube::* *)(void),boost::mpl::size_t<0x02>,boost::detail::multi_array::sub_array<void (__cdecl HCube::* )(void),0x01>>, 1> _InIt=boost::detail::multi_array::array_iterator<void (__cdecl HCube::* )(void),void (__cdecl HCube::* const *)(void),boost::mpl::size_t<0x02>,boost::detail::multi_array::const_sub_array<void (__cdecl HCube::* )(void),0x01>> 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=void (__cdecl HCube::* )(void), 1> TPtr=void (__cdecl HCube::* const *)(void), 1> NumDims=boost::mpl::size_t<0x02>, 1> Reference=boost::detail::multi_array::const_sub_array<void (__cdecl HCube::* )(void),0x01> 1> ] 1> and 1> [ 1> T=void (__cdecl HCube::* )(void), 1> TPtr=void (__cdecl HCube::* const *)(void), 1> NumDims=boost::mpl::size_t<0x02>, 1> Reference=boost::detail::multi_array::const_sub_array<void (__cdecl HCube::* )(void),0x01> 1> ] 1> and 1> [ 1> T=void (__cdecl HCube::* )(void), 1> TPtr=void (__cdecl HCube::* *)(void), 1> NumDims=boost::mpl::size_t<0x02>, 1> Reference=boost::detail::multi_array::sub_array<void (__cdecl HCube::* )(void),0x01> 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<void (__cdecl HCube::* )(void),void (__cdecl HCube::* *)(void),boost::mpl::size_t<0x02>,boost::detail::multi_array::sub_array<void (__cdecl HCube::* )(void),0x01>>, 1> _Iter=boost::detail::multi_array::array_iterator<void (__cdecl HCube::* )(void),void (__cdecl HCube::* const *)(void),boost::mpl::size_t<0x02>,boost::detail::multi_array::const_sub_array<void (__cdecl HCube::* )(void),0x01>>, 1> _InIt=boost::detail::multi_array::array_iterator<void (__cdecl HCube::* )(void),void (__cdecl HCube::* const *)(void),boost::mpl::size_t<0x02>,boost::detail::multi_array::const_sub_array<void (__cdecl HCube::* )(void),0x01>> 1> ] 1> C:\windev64\otherLib\boost_1_49_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,0x01>>>(_InIt,_InIt,_OutIt)' being compiled 1> with 1> [ 1> _OutIt=boost::detail::multi_array::array_iterator<void (__cdecl HCube::* )(void),void (__cdecl HCube::* *)(void),boost::mpl::size_t<0x02>,boost::detail::multi_array::sub_array<void (__cdecl HCube::* )(void),0x01>>, 1> T=void (__cdecl HCube::* )(void), 1> TPtr=void (__cdecl HCube::* const *)(void), 1> NumDims=boost::mpl::size_t<0x02>, 1> Reference=boost::detail::multi_array::const_sub_array<void (__cdecl HCube::* )(void),0x01>, 1> _InIt=boost::detail::multi_array::array_iterator<void (__cdecl HCube::* )(void),void (__cdecl HCube::* const *)(void),boost::mpl::size_t<0x02>,boost::detail::multi_array::const_sub_array<void (__cdecl HCube::* )(void),0x01>> 1> ] 1> C:\windev64\otherLib\boost_1_49_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=void (__cdecl HCube::* )(void), 1> NumDims=0x02 1> ] 1> C:\windev64\otherLib\boost_1_49_0\boost/multi_array.hpp(406) : see reference to class template instantiation 'boost::detail::multi_array::multi_array_view<T,NumDims>' being compiled 1> with 1> [ 1> T=void (__cdecl HCube::* )(void), 1> NumDims=0x02 1> ] 1> C:\windev64\otherLib\boost_1_49_0\boost/multi_array.hpp(402) : while compiling class template member function 'boost::multi_array<T,NumDims> &boost::multi_array<T,NumDims>::resize(const boost::detail::multi_array::extent_gen<NumRanges> &)' 1> with 1> [ 1> T=void (__cdecl HCube::* )(void), 1> NumDims=0x02, 1> NumRanges=0x02 1> ] 1> c:\windev64\mergelib\FSM.h(37) : see reference to class template instantiation 'boost::multi_array<T,NumDims>' being compiled 1> with 1> [ 1> T=void (__cdecl HCube::* )(void), 1> NumDims=0x02 1> ] 1> c:\windev64\mergelib\HCube.h(17) : see reference to class template instantiation 'FSM<T_DERIVED,T_RET>' being compiled 1> with 1> [ 1> T_DERIVED=HCube, 1> T_RET=void 1> ] ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========Ich werde aus der Meldung nicht schlau. Irgendwelche Tipps, was es da im Debug-Mode hat?
Danke!
-
Hmm...
Mit std::_Copy_impl scheint irgendwas nicht zu stimmen, aber da ich mich mi VC++ nicht auskenne..
Aber wieso meinst du, dass es was mit boost zu tun hat (oder meinst du das überhaupt)? Der Fehler tritt doch nicht in einem der Boost-Header auf.
-
Hacker schrieb:
Hmm...
Mit std::_Copy_impl scheint irgendwas nicht zu stimmen, aber da ich mich mi VC++ nicht auskenne..
Aber wieso meinst du, dass es was mit boost zu tun hat (oder meinst du das überhaupt)? Der Fehler tritt doch nicht in einem der Boost-Header auf.Nicht zwangsläufig, aber in dieser Zeile, wo der Fehler seinen Anfang
nimmt, wird ein boost::multi_array verwendet:FSM.h(37) : see reference to class template instantiation 'boost::multi_array<T,NumDims>' being compiled
-
..sonst wer eine Idee, was es da hat?
-
Der Fehler ist, dass boost::multi_array auf dem VC++ nicht funktioniert. Eigentlich funktioniert es nirgends. Bin gerade zu faul den Link rauszusuchen.
Aber mal in Kurzform:
std::copy erwartet im dritten Argument einen output_iterator. die iteratoren von multi_array können aber nur das input_iterator konzept modellieren, auch wenn sie konkret alles können, was std::copy braucht. Die meisten Compiler testen das Konzept an der Stelle nicht, nur der VC im Debug Modus. Nun verwendet boost::multi_array std::copy intern und dadurch entstehen die Compilefehler.
Ich glaube der Tenor auf der Boost mailingliste war: Das ist blöd. Sie könnten beim iterator_tag lügen, wollen sie aber nicht. Also müssten sie es umschreiben. Was daraus wurde, weiß ich nicht.
-
-
Danke otze und no one, die Informationen sind sehr hilfreich, denn jetzt brauche ich in meinem Code nicht mehr suchen. Ich werfe das Multi-Array raus.
Beste Grüße
-
Es gab im Trac noch einen Workaround:
#define _ITERATOR_DEBUG_LEVEL 1vor dem include. musst testen was passt, ich hab sowohl 1 als auch 0 gesehen. Es stellt sich momentan wohl übrigens so dar, dass Boost korrekt ist und der VC etwas implementiert, was so nicht im Standard steht.