Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 模板的MSVC重载错误,但不是g++;_C++ - Fatal编程技术网

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

C++ 模板的MSVC重载错误,但不是g++;,c++,C++,我在其他论坛上问过,但没有人回答:S我一直得到: 这6个重载都无法转换所有参数 不过,我只在VisualStudio中遇到这个问题。当我使用g++或代码块编译时,它工作得非常好 我调用模板时使用的代码是: MemDeSerialize(ListOfItems, SerializedData, size_t(Data[2])); 定义如下: typedef struct { //...... } PanelItem; std::vector<PanelItem> ListO

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

这6个重载都无法转换所有参数

不过,我只在VisualStudio中遇到这个问题。当我使用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);
typedef结构
{
//......
}小组项目;
std::向量列表项;
模板
void MemDeSerialize(T&目标,无符号字符*&源){…}
模板
void MemDeSerialize(T*&目标,无符号字符*&源,大小){…}
模板
void MemDeSerialize(std::vector&Destination,unsigned char*&Source,size\u t size)
{
目的地。调整大小(大小);
对于(大小I=0;I
我经常遇到的错误是:

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 ==========
1>错误C2665:'MemDeSerialize':6个重载都不能转换所有参数类型
1> 可以是“void MemDeSerialize(T*&,unsigned char*&,size_T)”
1> 与
1>          [
1> T=面板项目
1>          ]
1> 尝试匹配参数列表时“(PanelItem*,unsigned char*,size_t)”
1> 请参阅正在编译的函数模板实例化“void MemDeSerialize(std::vector&,unsigned char*&,size_t)”的参考
1> 与
1>          [
1> _Ty=面板项目
1>          ]
======生成:0成功,1失败,0最新,0跳过==========
你知道为什么吗?它在代码块中编译得很好;只是不是VisualStudio


我一直这样称呼它:
MemDeSerialize(ListOfItems,SerializedData,size_t(数据[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);
    }
}
模板
void MemDeSerialize(std::vector&Destination,unsigned char*&Source,size\u t size)
{
目的地。调整大小(大小);
对于(大小I=0;I
我的猜测是,直接传递
&Destination[I]
只会给出指针值(元素的地址),实际上并没有给出可以引用的指针变量。GCC可能更灵活地允许您使用临时工具来实现这一点


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

函数调用中参数的数据类型是什么?ListoItems是PanelItems的向量,它是一个结构。SerializedData是一个无符号字符*,数据[2]是一个双精度字符。@CantChooseServerNames:根据错误消息,
ListoItems
不是
PanelItems
的向量,而是
PanelItem*
“6个重载中没有一个”?我看到七个过载…@K-ballo我不这么认为。我将鼠标悬停在它上面,它表明它是一个向量:向量的内容是一个PanelItem。我认为它在抱怨上面的向量模板过载:
for(size\u t I=0;I