Question about CMap and CString& as ARG_KEY
MARGHAL@gw2k.com Thursday, April 18, 1996 Form: Memo Text: (87 lines follow) I'm using VC++ 4.1 with WinNT 3.51 Build 1057 I'm trying to use CMap for the first time, and I have run into a compile error that puzzles me. This isn't a big problem because I've found a work-around, but, I'm hoping someone will explain why this compile error occurs. I've checked the MFC faq, the MSDN, and three or four books on MFC including "Inside Visual C++" and "Win32 Programming Using Visual C++" and none of them have shed any light on the situation. In fact, "Win32 Prog. Using VC++" confuses me further because it says I can do what I'm trying to do. My CMap declaration looks like this: typedef CMapCMapOfMyObs; And I have an instantiation of the CMap in InitInstance that looks like this; CMapOfMyObs myObs; CMyObject is derived from CObject with a trivial implementation like this: class CMyObject : public CObject { DECLARE_DYNCREATE(CMyObject); public: CMyObject() {}; ~CMyObject(){}; CMyObject& operator=( CMyObject rhs ); CMyObject( CMyObject& p ); }; Pretty basic stuff so far. When I compile, I get this compile error: E:\MSDEV\MFC\include\afxtempl.h(128) : error C2440: 'abstract declarator' : cannot convert from 'class CString' to 'unsigned long' (new behavior; please see help) The code in afxtempl.h that is flagged by the error is this: template inline UINT AFXAPI HashKey(ARG_KEY key) { // default identity hash - works for most primitive values >>>> return ((UINT)(void*)(DWORD)key) >> 4; // <<<<<<<<< here's the line } It seems obvious that the problem is related to the ARG_KEY parameter to the CMap template. My ARG_KEY is a CString& and this HashKey function is expecting a simple type. Now, on page 465 of Mike Blaszczak's book we find this statement: "A template instantiation for CMap might look like this: CMap mapStates; This is very much like my CMap template instantiation. On page 466 of the same book it says this about the CMap HashKey function: "The MFC doesn't provide a default implementation for HashKey(), unless the collection is referencing a CString type. The CString HashKey() function can be found in STREX.CPP... and looks like this: " UINT AFXAPI HashKey(LPCTSTR key) { UINT nHash = 0; while (*key) nHash = (nHash<<5) + nHash + *key++; return nHash; } In checking, I find that this HashKey function is in MFC 4.x and I find that if I change my CMap declaration to use an LPCTSTR instead of a CString&, the compile error is eliminated. (Note, my original code does not compile under VC++ 2.1 either.) So my question is: is there a way I can use a CString& as my ARG_KEY parameter to the CMap template, or am I stuck using an LPCTSTR? Al Margheim Use Proportional Font: true
bop@gandalf.se Monday, April 22, 1996 > From MARGHAL @ gw2k.com > I'm using VC++ 4.1 with WinNT 3.51 Build 1057 > > I'm trying to use CMap for the first time, and I have run into a compile > error that puzzles me. This isn't a big problem because I've found a > work-around, but, I'm hoping someone will explain why this compile error > occurs. [...] >My CMap declaration looks like this: > > typedef CMapCMapOfMyObs; > [...] > When I compile, I get this compile error: > > E:\MSDEV\MFC\include\afxtempl.h(128) : error C2440: 'abstract declarator' : > cannot convert from 'class CString' to 'unsigned long' (new behavior; > please see help) > > The code in afxtempl.h that is flagged by the error is this: > > template > inline UINT AFXAPI HashKey(ARG_KEY key) > { > // default identity hash - works for most primitive values > >>>> return ((UINT)(void*)(DWORD)key) >> 4; // <<<<<<<<< here's the line > } > > It seems obvious that the problem is related to the ARG_KEY parameter to the > CMap template. My ARG_KEY is a CString& and this HashKey function is > expecting a simple type. > > "The MFC doesn't provide a default implementation for HashKey(), unless the > collection is referencing a CString type. The CString HashKey() function > can be found in STREX.CPP... and looks like this: " > > UINT AFXAPI HashKey(LPCTSTR key) > { > UINT nHash = 0; > while (*key) > nHash = (nHash<<5) + nHash + *key++; > return nHash; > } > [...] > So my question is: is there a way I can use a CString& as my ARG_KEY > parameter to the CMap template, or am I stuck using an LPCTSTR? You have it right here: "The MFC doesn't provide a default implementation for HashKey(), UNLESS the collection is referencing a CString type." So, if you want another hash function ("none of the above") you have to provide it yourself! You might try something like: UINT AFXAPI HashKey(CString& Key) { UINT nHash = 0; for (int i = 0; i
| Вернуться в корень Архива |