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. |