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 1
    

    vor 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.


Anmelden zum Antworten