Я столкнулся с интересной проблемой: у меня был проект приложения MFC в Visual C ++ 6.0. Поскольку в MFC или в стандарте C ++ есть много изменений, я хотел перенести свое приложение на Visual Studio 2010. Это было нормально, но сейчас я вижу предупреждение, которое я не могу обработать.
Заголовочный файл имеет следующее определение класса:
template <class T>
class foo : public CObject
{
// ...
// other stuff
// ...
private:
CTypedPtrMap<CMapWordToPtr, const long, T*> oElementMap;
void some_stuff();
}
В исходном файле есть:
template <class T>
void foo::some_stuff()
{
// ...
// other stuff
// ...
int nIndex = 0;
// ...
// other stuff
// ...
oElementMap.RemoveKey(nIndex);
}
Когда я пытаюсь скомпилировать это, я получаю следующие предупреждения:
Предупреждение 1 предупреждение C4244: «аргумент»: преобразование из «const long» в
«СЛОВО», возможная потеря данных c: \ program \ microsoft visual studio
10.0 \ vc \ atlmfc \ include \ afxtempl.h 2066
Это определенно происходит из вышеупомянутой строки «RemoveKey»: если я просто закомментирую эту строку, я не получу это предупреждение.
Я знаю, главная проблема в том, что CTypedPtrMap
объект использует const long
как тип ключа, но CMapWordToPtr
будет иметь WORD
(без знака) вместо этого. Но дело в том, что мне нужен const long как тип ключа, так как я регулярно обрабатываю около 1 миллиона записей данных на этой карте, поэтому unsigned short
класс не сможет выполнять свою работу более того.
Я пытался вложить либо строку «RemoveKey», либо включить stdafx.h
в следующие выражения, но ни один не работал:
#pragma warning (disable: 4244)
// expression
#pragma warning (default: 4244)
Пожалуйста, поделитесь со мной своими идеями по этому вопросу, как я могу решить это предупреждение, БЕЗ изменения контейнера oElementMap
определение и поведение, и БЕЗ подавления / отключения этого предупреждения глобально в настройках проекта, а также БЕЗ изменения afxtempl.h
файл предоставлен VS2010.
Спасибо за помощь:
Эндрю
Я заменил это определение на: CMap<long, long&, T*, T*&> oElementMap;
, Я не был уверен, что это «длинный аналог» старого определения карты, поэтому я провел несколько тестов, чтобы сравнить их.
Решение было наконец это.
Других решений пока нет …