簡體   English   中英

模板的MSVC重載錯誤,但不是g ++

[英]MSVC Overload error for templates but not g++

我曾在其他論壇上提問,但沒有人回答:SI不斷得到:

6個重載都不能轉換所有參數。

我只在Visual Studio中遇到此問題。 當我使用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]));

好吧,我不能說為什么會發生,但是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時,GCC可能更靈活。

從標准的角度來看,我不知道正確的行為是什么。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM