Как справиться с предупреждением в контексте 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;, Я не был уверен, что это "длинный аналог" старого определения карты, поэтому я провел несколько тестов, чтобы сравнить их.

Решение было наконец это.

Другие вопросы по тегам