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