Visual Studio 2010 — Как справиться с предупреждением в контексте 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» в
«СЛОВО», возможная потеря данных 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.

Спасибо за помощь:

Эндрю

2

Решение

Я заменил это определение на: CMap<long, long&, T*, T*&> oElementMap;, Я не был уверен, что это «длинный аналог» старого определения карты, поэтому я провел несколько тестов, чтобы сравнить их.

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

0

Другие решения

Других решений пока нет …