Как справиться с предупреждением в контексте C++ inline + шаблона?
Я столкнулся с интересной проблемой: у меня был проект приложения 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" в "WORD", возможная потеря данных 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.
Спасибо за помощь:
Эндрю
1 ответ
Я заменил это определение на: CMap<long, long&, T*, T*&> oElementMap;
, Я не был уверен, что это "длинный аналог" старого определения карты, поэтому я провел несколько тестов, чтобы сравнить их.
Решение было наконец это.