Когда я пытаюсь скомпилировать программу, я получаю кучу ошибок, таких как: 'std :: max': не найдена соответствующая перегруженная функция - PullRequest
0 голосов
/ 15 января 2019

Когда я пытаюсь скомпилировать программу, я получаю кучу ошибок, таких как:

'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 );
    }

Может ли кто-нибудь помочь мне с этим.

1 Ответ

0 голосов
/ 15 января 2019

Оператор sizeof возвращает значение типа size_t, которое является беззнаковым целочисленным типом.

Ваш вызов std::max смешивает два разных типа (без знака size_t и со знаком int), а std::max требует, чтобы оба аргумента были того же типа.

Как упомянуто в комментарии, подходящее решение состоит в том, чтобы сделать переменную nAlign того же типа, то есть a size_t. Выравнивание никогда не может быть отрицательным, а также является своего рода размером. Это также гарантирует, что типы имеют одинаковый размер (size_t может быть 64-битным типом, тогда как unsigned int обычно составляет 32 бита).

Если изменение типа nAlign невозможно, то вы должны привести результат sizeof к int (это безопаснее, поскольку кто-то может передать отрицательное значение для nAlign, что будет иметь плохие последствия, если приведено к типу без знака).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...