2013-03-28 2 views
2

저는 흥미로운 문제에 봉착했습니다 : Visual C++ 6.0에서 MFC 응용 프로그램 프로젝트가있었습니다. MFC 나 C++ 표준에서 많은 변화가 있었기 때문에 Visual Studio 2010으로 응용 프로그램을 포팅하고 싶었습니다. 괜찮 았지만 지금은 해결할 수없는 경고에 직면하고 있습니다. 이 소스 파일에서C++ 인라인 + 템플릿 컨텍스트에서 경고를 처리하는 방법은 무엇입니까?

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의 : \ 프로그램 마이크로 소프트 비주얼 스튜디오 \ 10.0 \ VC는 \ atlmfc \ 2,066

그것은 위에서 언급 한 "RemoveKey"라인에서의 definetly 제공 afxtempl.h \ 포함 : 그냥 단순히 줄을 주석하는 경우, 나는이 경고를 얻지 않을 것이다.

알아요, 주요 문제는 대신의 CTypedPtrMap 객체는 키의 형태로 const long를 사용하지만, CMapWordToPtrWORD (서명되지 않은 짧은) 것입니다. 하지만 사실은 :이지도에서 약 1 백만 개의 데이터 항목을 처리 중이므로 키 유형으로 const가 오래 있어야합니다. 따라서 unsigned short을 사용하면 클래스가 더 이상 일을 할 수 없게됩니다.

는 내가 "RemoveKey"행 또는 중 하나는 다음과 같은 식으로 stdafx.h의 포함 둥지로했지만, 어느 쪽도 일 :

#pragma warning (disable: 4244) 
// expression 
#pragma warning (default: 4244) 

나에게이 문제에 대한 아이디어를 공유하세요, 나는이 경고를 어떻게 해결할 수 컨테이너의 oElementMap 정의 및 동작을 변경하지 않고 WITHOUT을 VS2010에서 제공하는 afxtempl.h 파일을 변경하지 않고 프로젝트 설정에서 전역으로 경고를 비활성화/비활성화합니다. 도움을

감사 : CMap<long, long&, T*, T*&> oElementMap; :

앤드류

+1

'oElementMap.RemoveKey (static_cast (nIndex));라고 쓰면 경고 메시지가 나타 납니까? – utnapistim

+2

'WORD'에 대한 키가 너무 많아서 대신'long'을 사용해야한다면,'CMapWordToPtr'를 기본 클래스로 사용하면 어느 시점에서 실패 할 것입니다. – BoBTFish

+1

BoBTFish : 네, 맞아요. 문제는'CMapDwordToPtr' 같은 것이 없기 때문에 유용 할 것입니다 ... –

답변

0

나는 그것을 정의를 교체했습니다. 나는 오래된지도 정의의 "긴 대응 물"이라고 확신하지 못했습니다. 그래서 나는 그것들을 비교하기위한 몇 가지 테스트를했습니다.

마지막으로 해결책이있었습니다.

관련 문제