当我尝试编译程序时,我遇到了一堆错误,例如:
'std::max': no matching overloaded function found
'const _Ty &std::max(const _Ty &,const _Ty &,_Pr) noexcept(<expr>)': expects 3 arguments - 2 provided
C2782: 'const _Ty &std::max(const _Ty &,const _Ty &) noexcept(<expr>)': template parameter '_Ty' is ambiguous
C2784: 'const _Ty &std::max(const _Ty &,const _Ty &) noexcept(<expr>)': could not deduce template argument for 'const _Ty &' from 'int'
以下是导致大多数问题的代码:
template <typename TVar>
void CopyVar( void*& pTarget, const void*& pSource, int nAlign = 4 )
{
*((TVar*) pTarget) = *((TVar*) pSource);
((BYTE*&) pTarget) += max( sizeof(TVar), nAlign );
((BYTE*&) pSource) += max( sizeof(TVar), nAlign );
}
有人可以帮我解决这个问题吗?
sizeof
运算符返回一个类型为 size_t
的值,这是一个无符号整数类型。
对 std::max
的调用混合了两种不同的类型(无符号size_t
和有符号int
),std::max
要求两个参数的类型相同。
如评论中所述,合适的解决方案是使nAlign
变量具有相同的类型,即size_t
。对齐永远不会是负的,也是一种大小。它还确保类型大小相同(size_t
可以是 64 位类型,而unsigned int
通常是 32 位)。
如果无法更改nAlign
类型,则应将sizeof
的结果强制转换为int
(这更安全,因为有人可能会为nAlign
传递负值,如果转换为无符号类型,这将产生不良后果)。