模板的 MSVC 重载错误,但不是 g++
MSVC Overload error for templates but not g++
我在其他论坛上问过,但没有人回答: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 在允许您使用临时人员方面可能更灵活。
我不知道从标准的角度来看,正确的行为是什么。
相关文章:
- 警告处理为错误这里有什么问题
- "error: no matching function for call to"构造函数错误
- boost::进程间消息队列引发错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- QT在错误的班级中寻找空位
- vector.resize()中的分配错误
- 代码在main()中运行,但在函数中出现错误
- 释放错误后堆使用
- (C++)分析树以计算返回错误值的简单算术表达式
- Project Euler问题4的错误解决方案
- 我的字符计数代码计算错误.为什么
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 尝试导入pybind-opencv模块时出现libgtk错误
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 在某些循环内使用vector.push_back时出现分段错误
- MSVC多行宏编译器错误
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 错误:未在此范围内声明'reverse'