PRB: C2440 Error When Using CMap and User Defined Key TypeLast reviewed: July 2, 1997Article ID: Q158541 |
The information in this article applies to:
SYMPTOMSWhen using the Cmap-templated collection class with a user-defined class as the data type for key arguments, the compiler generates the following compiler error:
afxtempl.h(97) : error C2440: 'abstract declarator' : cannot convert from 'class CClass' to 'unsigned long'where CClass is the name of the user-defined class.
CAUSEThe default implementation of CMap's HashKey function takes an DWORD (unsigned long) as a parameter. The compiler does not know how to convert from a user-defined class type to an unsigned long.
RESOLUTIONCreate a static template function to generate a custom HashKey value.
STATUSThis behavior is by design.
MORE INFORMATION
Sample CodeThis is a sample declaration of a CMap that uses a user-defined class for as data-type for a Cmap:
#include <afxtempl.h> class CEmployee : public CObject { public: CString m_firstName; CString m_lastName; public: CEmployee(){ }; // Copy constructor required by Cmap. CEmployee(const CEmployee& n) { m_firstName = n.m_firstName; m_lastName = n.m_lastName; } // Operator= is required by Cmap. CEmployee& operator=(const CEmployee& n) { m_firstName = n.m_firstName; m_lastName = n.m_lastName; return *this; } BOOL AFXAPI operator==(const CEmployee& n) const { return m_firstName == n.m_firstName && m_lastName == n.m_lastName; } }; template<> inline UINT AFXAPI HashKey(CEmployee& key) { return HashKey((LPCTSTR)key.m_lastName) + HashKey((LPCTSTR)key.m_firstName); } // Declare the CMap object. CMap<CEmployee, CEmployee&, CEmployee, CEmployee&> EmployeeMap; |
Keywords : kberrmsg kbprg MfcMisc vcbuglist420
© 1998 Microsoft Corporation. All rights reserved. Terms of Use. |