У меня возникла интересная проблема: у меня был проект приложения MFC в Visual C++ 6.0. Поскольку в MFC или в стандарте C++ существует много изменений, я хотел бы перенести мое приложение в Visual Studio 2010. Это было прекрасно, но сейчас я вижу предупреждение, с которым я не могу справиться.Как справиться с предупреждением в контексте C + + inline + template?
Файл заголовка имеет следующее определение класса:
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
(беззнаковое короткое замыкание) вместо него. Но дело в том, что мне нужна константа в качестве ключевого типа, так как я обрабатываю около 1 миллиона записей данных на этой карте, поэтому с unsigned short
класс также не сможет выполнять свою работу.
Я попытался гнездо либо линия «RemoveKey» или включают в stdafx.h
в следующих выражениях, но ни работали:
#pragma warning (disable: 4244)
// expression
#pragma warning (default: 4244)
Пожалуйста, поделитесь мне какие-либо идеи по поводу этого вопроса, как я мог решить это предупреждение БЕЗ изменения определения и поведения контейнера oElementMap
и БЕЗ подавления или отключения этого предупреждения в глобальном масштабе в настройках проекта, а также без изменения файла afxtempl.h
, предоставленного VS2010.
Спасибо за помощь:
Эндрю
Вы все еще получаете предупреждение, если вы пишете 'oElementMap.RemoveKey (static_cast (nIndex));'? –
utnapistim
Если у вас слишком много ключей для 'WORD', и вместо этого нужно использовать' long', то с помощью 'CMapWordToPtr', поскольку базовый класс в какой-то момент будет терпеть неудачу? – BoBTFish
BoBTFish: Да, вы правы. Проблема в том, что не существует «CMapDwordToPtr» или что-то в этом роде, было бы полезно ... –