当我尝试编译程序时,我遇到了一堆错误,例如:'std::max':找不到匹配的重载函数

When i try to compile a program i got a bunch of errors like :'std::max': no matching overloaded function found

本文关键字:std max 重载 函数 例如 找不到 一堆 遇到 编译程序 错误      更新时间:2023-10-16

当我尝试编译程序时,我遇到了一堆错误,例如:

'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传递负值,如果转换为无符号类型,这将产生不良后果)。