2013-03-28 2 views
2

У меня возникла интересная проблема: у меня был проект приложения 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.

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

Эндрю

+1

Вы все еще получаете предупреждение, если вы пишете 'oElementMap.RemoveKey (static_cast (nIndex));'? – utnapistim

+2

Если у вас слишком много ключей для 'WORD', и вместо этого нужно использовать' long', то с помощью 'CMapWordToPtr', поскольку базовый класс в какой-то момент будет терпеть неудачу? – BoBTFish

+1

BoBTFish: Да, вы правы. Проблема в том, что не существует «CMapDwordToPtr» или что-то в этом роде, было бы полезно ... –

ответ

0

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

Решение было окончательно.

Смежные вопросы