만약 Visual C++ 6.0에서 작성된 MFC 어플 소스코드를 가지고 작업하다 컴파일이 안될 경우가 있습니다.
아래와 같은 예가 나오면
playmmsound.cpp(53) : error C2440: 'static_cast' : 'LRESULT (__thiscall CPlayMMSound::* )(WPARAM,LPARAM)'에서 'void (__thiscall CWinThread::* )(WPARAM,LPARAM)'(으)로 변환할 수 없습니다. 대상 형식과 일치하는 범위에 이름이 같은 함수가 없습니다.
함수의 선언과 구현부의 LRESULT를 void로 바꿔야 제대로 돌아갑니다.
// for Thread messages
#define ON_THREAD_MESSAGE(message, memberFxn) \
{ message, 0, 0, 0, AfxSig_vwl, \
(AFX_PMSG)(AFX_PMSGT) \
(static_cast< void (AFX_MSG_CALL CWinThread::*)(WPARAM, LPARAM) > \
(memberFxn)) },
위가 ON_THREAD_MESSAGE의 매크로의 정의입니다. 위에서 보면 void 함수를 받도록 되어 있습니다.
그러나 LRESULT 타입과 void 타입은 다르기 때문에 문제가 있습니다.
Visual Studio 2008,2010에서는 Visual C++ 6.0보다 엄격한 규칙을 적용하기 때문에, 기존에 허용되던 형변환이 허용되지 않아서 생기는 문제인것 같습니다.
쉽게 말해서 LRESULT로 선언된 메소드와 구현 부분을 전부 void type으로 바꿔야 제대로 돌아간다는 이야기입니다.
'컴퓨터 > 프로그래밍' 카테고리의 다른 글
C++11 은 기존의 C++ 표준과 많이 다르다? (0) | 2011.10.31 |
---|---|
MFC에서 웹캠으로 영상처리 작업하다 에러 생길경우. (1) | 2010.10.25 |
Unicode의 이해 단계는? (1) | 2010.10.11 |
Inside the C compiler (0) | 2010.05.30 |
C Programming의 내부를 파헤쳐보기 - Inside the C Programming (0) | 2010.05.30 |