Function Pointer Array compiliert mit GCC, mit VS2010 aber nicht.



  • Hi

    Ich habe hier einen Code, den gcc brav compiliert, aber VS 2010 nicht. Konkret
    geht es um die Zeile "fptrArrayType fpntTab;", wo ein boost::multi_array Zeiger
    auf Methoden einer Klasse speichert.

    template<class T_DERIVED,class T_RET>
    class FSM
    {
    	typedef T_RET(T_DERIVED::*mtdPtr)();
    	typedef boost::multi_array<mtdPtr ,2> fptrArrayType;
    
    protected:
    	fptrArrayType fpntTab;
    }
    

    Die Fehlermeldung von VS2010 ist etwas länger:

    C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xutility(2216): error C2665: "std::_Copy_impl": Durch keine der 2 Überladungen konnten alle Argumenttypen konvertiert werden.
    2>          C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xutility(2182): kann '_OutIt std::_Copy_impl<_InIt,_OutIt>(_InIt,_InIt,_OutIt,std::input_iterator_tag,std::output_iterator_tag)' sein
    2>          with
    2>          [
    2>              _OutIt=boost::detail::multi_array::array_iterator<unsigned int,unsigned int *,boost::mpl::size_t<2>,boost::detail::multi_array::sub_array<unsigned int,1>>,
    2>              _InIt=boost::detail::multi_array::array_iterator<unsigned int,const unsigned int *,boost::mpl::size_t<2>,boost::detail::multi_array::const_sub_array<unsigned int,1>>
    2>          ]
    2>          C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xutility(2191): oder "_OutIt std::_Copy_impl<_InIt,_OutIt>(_InIt,_InIt,_OutIt,std::random_access_iterator_tag,std::random_access_iterator_tag)"
    2>          with
    2>          [
    2>              _OutIt=boost::detail::multi_array::array_iterator<unsigned int,unsigned int *,boost::mpl::size_t<2>,boost::detail::multi_array::sub_array<unsigned int,1>>,
    2>              _InIt=boost::detail::multi_array::array_iterator<unsigned int,const unsigned int *,boost::mpl::size_t<2>,boost::detail::multi_array::const_sub_array<unsigned int,1>>
    2>          ]
    2>          bei Anpassung der Argumentliste '(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>)'
    2>          with
    2>          [
    2>              T=unsigned int,
    2>              TPtr=const unsigned int *,
    2>              NumDims=boost::mpl::size_t<2>,
    2>              Reference=boost::detail::multi_array::const_sub_array<unsigned int,1>
    2>          ]
    2>          and
    2>          [
    2>              T=unsigned int,
    2>              TPtr=const unsigned int *,
    2>              NumDims=boost::mpl::size_t<2>,
    2>              Reference=boost::detail::multi_array::const_sub_array<unsigned int,1>
    2>          ]
    2>          and
    2>          [
    2>              T=unsigned int,
    2>              TPtr=unsigned int *,
    2>              NumDims=boost::mpl::size_t<2>,
    2>              Reference=boost::detail::multi_array::sub_array<unsigned int,1>
    2>          ]
    2>          and
    2>          [
    2>              Category=std::input_iterator_tag,
    2>              Traversal=boost::random_access_traversal_tag
    2>          ]
    2>          and
    2>          [
    2>              Category=std::input_iterator_tag,
    2>              Traversal=boost::random_access_traversal_tag
    2>          ]
    2>          C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xutility(2227): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template "_OutIt std::_Copy_impl<_Iter,_OutIt>(_InIt,_InIt,_OutIt,std::tr1::false_type)".
    2>          with
    2>          [
    2>              _OutIt=boost::detail::multi_array::array_iterator<unsigned int,unsigned int *,boost::mpl::size_t<2>,boost::detail::multi_array::sub_array<unsigned int,1>>,
    2>              _Iter=boost::detail::multi_array::array_iterator<unsigned int,const unsigned int *,boost::mpl::size_t<2>,boost::detail::multi_array::const_sub_array<unsigned int,1>>,
    2>              _InIt=boost::detail::multi_array::array_iterator<unsigned int,const unsigned int *,boost::mpl::size_t<2>,boost::detail::multi_array::const_sub_array<unsigned int,1>>
    2>          ]
    2>          C:\windev\otherLib\boost_1_46_1\boost/multi_array/view.hpp(321): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template "_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)".
    2>          with
    2>          [
    2>              _OutIt=boost::detail::multi_array::array_iterator<unsigned int,unsigned int *,boost::mpl::size_t<2>,boost::detail::multi_array::sub_array<unsigned int,1>>,
    2>              T=unsigned int,
    2>              TPtr=const unsigned int *,
    2>              NumDims=boost::mpl::size_t<2>,
    2>              Reference=boost::detail::multi_array::const_sub_array<unsigned int,1>,
    2>              _InIt=boost::detail::multi_array::array_iterator<unsigned int,const unsigned int *,boost::mpl::size_t<2>,boost::detail::multi_array::const_sub_array<unsigned int,1>>
    2>          ]
    2>          C:\windev\otherLib\boost_1_46_1\boost/multi_array/view.hpp(313): Bei der Kompilierung der  Klassen-template der 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> &)-Memberfunktion
    2>          with
    2>          [
    2>              T=unsigned int,
    2>              NumDims=2
    2>          ]
    2>          C:\windev\otherLib\boost_1_46_1\boost/multi_array.hpp(406): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template "boost::detail::multi_array::multi_array_view<T,NumDims>".
    2>          with
    2>          [
    2>              T=unsigned int,
    2>              NumDims=2
    2>          ]
    2>          C:\windev\otherLib\boost_1_46_1\boost/multi_array.hpp(402): Bei der Kompilierung der  Klassen-template der boost::multi_array<T,NumDims> &boost::multi_array<T,NumDims>::resize(const boost::detail::multi_array::extent_gen<NumRanges> &)-Memberfunktion
    2>          with
    2>          [
    2>              T=unsigned int,
    2>              NumDims=2,
    2>              NumRanges=2
    2>          ]
    2>          FSM.h(35): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template "boost::multi_array<T,NumDims>".
    2>          with
    2>          [
    2>              T=unsigned int,
    2>              NumDims=2
    2>          ]
    2>          FSM.h(36): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template "FSM<T_DERIVED,T_RET>".
    

    Ideen, was da nicht stimmt? Der Fehler tritt übrigens _nur_ im Debug-Mode
    auf, nicht im Release.

    Danke, lg



  • Die Konstruktion wird von VS2010 mit 32 Bit im Debug-Mode nicht akzeptiert, aber der 32 Bit Release-Mode, sowie 64 Bit im Debug- und Release-Mode sagen, es ist okay.

    ..insofern wird das jetzt ignoriert.


Anmelden zum Antworten