gpt4 book ai didi

c++ - 模板而非 g++ 的 MSVC 重载错误

转载 作者:行者123 更新时间:2023-11-28 07:59:14 29 4
gpt4 key购买 nike

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

None of the 6 overloads could convert all arguments.

虽然我只在 visual studio 中遇到这个问题。当我用 g++ 或 codeblocks 编译时,它工作得很好。

我调用模板的代码是:

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 在允许您使用临时对象执行此操作方面可能更灵活。

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

关于c++ - 模板而非 g++ 的 MSVC 重载错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11942419/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com