模板的 MSVC 重载错误,但不是 g++

MSVC Overload error for templates but not g++

本文关键字:g++ 错误 MSVC 重载      更新时间:2023-10-16

我在其他论坛上问过,但没有人回答:S 我一直得到:

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 ==========

知道为什么吗?它在代码块中编译得很好;只是不是Visual Studio。

我一直这样称呼它: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 在允许您使用临时人员方面可能更灵活。

我不知道从标准的角度来看,正确的行为是什么。