CAtlArray<MMC_COOKIE> Cookies;
MMC_COOKIE Cookie;
...
Cookies.Add(Cookie); — на этой строке компилятор выдает warning C4244: 'argument' : conversion from 'MMC_COOKIE' to 'long', possible loss of data
Варнинг есть как VS2003 так и в VS2005.
MMC_COOKIE определен следующим образом:
typedef _W64 long LONG_PTR, *PLONG_PTR;
typedef LONG_PTR MMC_COOKIE;
Компилируется все под WIN32.
Если при этом в качестве контейнера используется std::vector<MMC_COOKIE>, то никаких проблем нет.
Возможно проблема в том, что включена проверка на возможные ошибки при переносе на 64-битную платформу. В MSVC есть ошибка. Он находит явную специализацию CElementTraits, который используется в CAtlArray, при этом при расширении типа на другой платформе будет использоваться другая специализация, и именно этот случай MSCV не замечает и считает, что после расширения начнутся проблемы. На то и ругается.
Решение. Игнорировать это предупреждение или отключить в том месте, где используется. Ничего хорошего с этим сделать нельзя.
Здравствуйте, Сомов Александр, Вы писали:
СА>Возможно проблема в том, что включена проверка на возможные ошибки при переносе на 64-битную платформу. В MSVC есть ошибка. Он находит явную специализацию CElementTraits, который используется в CAtlArray, при этом при расширении типа на другой платформе будет использоваться другая специализация, и именно этот случай MSCV не замечает и считает, что после расширения начнутся проблемы. На то и ругается.
Да проблема была именно в этом. После отключения опции компиляции Detect 64-bit portability Issues варнинги исчезли.
Здравствуйте, IlFun, Вы писали:
IF>Здравствуйте, Сомов Александр, Вы писали:
СА>>Возможно проблема в том, что включена проверка на возможные ошибки при переносе на 64-битную платформу. В MSVC есть ошибка. Он находит явную специализацию CElementTraits, который используется в CAtlArray, при этом при расширении типа на другой платформе будет использоваться другая специализация, и именно этот случай MSCV не замечает и считает, что после расширения начнутся проблемы. На то и ругается.
IF>Да проблема была именно в этом. После отключения опции компиляции Detect 64-bit portability Issues варнинги исчезли.
Так а зачем ее отключать? Можно вообще cl -W0. Когда-нибудь всё равно придется портировать на 64-битную систему, вот пусть код будет к этому сразу готов.
RO>Так а зачем ее отключать? Можно вообще cl -W0. Когда-нибудь всё равно придется портировать на 64-битную систему, вот пусть код будет к этому сразу готов.
В данном случае предупреждение абсолютно незаконное. Такой код будет правильно работать и в 32-битной и в 64-битной системе. Это ошибка компилятора, к тому же признанная Microsoft. Отключать все проверки действительно не стоит, но и корректно обернуть такой код #pragma warning'ами нелегко.