0

私は他のフォーラムで尋ねましたが、誰も答えませんでした:SI取得し続けます:

6 つのオーバーロードのいずれも、すべての引数を変換できませんでした。

ただし、この問題はビジュアルスタジオでのみ発生します。g++ またはコードブロックでコンパイルすると、完全に正常に動作します。

テンプレートを呼び出すコードは次のとおりです。

MemDeSerialize(ListOfItems, SerializedData, size_t(Data[2]));

定義:

typedef struct
{
    //......
} PanelItem;

std::vector<PanelItem> ListOfItems;

template<typename T>
void MemDeSerialize(T& Destination, unsigned char* &Source){...}

template<typename T>
void MemDeSerialize(T*& Destination, unsigned char* &Source, size_t Size){...}

template<typename T>
void MemDeSerialize(std::vector<T> &Destination, unsigned char* &Source, size_t Size)
{
    Destination.resize(Size);
    for (size_t I = 0; I < Size; ++I)
        MemDeSerialize(&Destination[I], Source, Size);
}


                                                /** FUNCTION OVERLOADS **/


void MemDeSerialize(Model* Destination, unsigned char* &Source);

void MemDeSerialize(PanelItem* Destination, unsigned char* &Source);

void MemDeSerialize(Compass* Destination, unsigned char* &Source);

void MemDeSerialize(FontChar* Destination, unsigned char* &Source);

私が取得し続けるエラーは次のとおりです。

1>error C2665: 'MemDeSerialize' : none of the 6 overloads could convert all the argument types
1>could be 'void MemDeSerialize<PanelItem>(T *&,unsigned char *&,size_t)'
1>          with
1>          [
1>              T=PanelItem
1>          ]
1>          while trying to match the argument list '(PanelItem *, unsigned char *, size_t)'
1>          see reference to function template instantiation 'void MemDeSerialize<PanelItem>(std::vector<_Ty> &,unsigned char *&,size_t)' being compiled
1>          with
1>          [
1>              _Ty=PanelItem
1>          ]
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

理由はありますか?コードブロックで問題なくコンパイルされます。ビジュアルスタジオではありません。

私はそれを次のように呼んでいます:MemDeSerialize(ListOfItems, SerializedData, size_t(Data[2]));

4

1 に答える 1

1

なぜそれが起こるのかはわかりませんが、MSVC では、参照として渡すポインター変数を定義する必要があるようです。

template<typename T>
void MemDeSerialize(std::vector<T> &Destination, unsigned char* &Source, size_t Size)
{
    Destination.resize(Size);
    for (size_t I = 0; I < Size; ++I)
    {
        T* foo = &Destination[I];
        MemDeSerialize(foo, Source, Size);
    }
}

私の推測では、&Destination[I]直接渡すことはポインター値 (要素のアドレス) を提供するだけであり、参照できるポインター変数を実際に提供するわけではありません。GCC は、一時的にそれを行うことができるという点で、おそらくより柔軟です。

標準の観点から正しい動作が何であるかはわかりません。

于 2012-08-13T22:02:17.773 に答える