PRB: C2440 Error When Using CMap and User Defined Key Type
ID: Q158541
|
The information in this article applies to:
-
The Microsoft Foundation Classes (MFC), included with:
-
Microsoft Visual C++, 32-bit Editions, versions 4.0, 4.1
SYMPTOMS
When 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.
CAUSE
The 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.
RESOLUTION
Create a static template function to generate a custom HashKey value.
STATUS
This behavior is by design.
MORE INFORMATION
Sample Code
This 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;
Additional query words:
Keywords : kberrmsg kbnokeyword kbMFC kbVC
Version : 4.0 4.1
Platform : NT WINDOWS
Issue type : kbprb