Microsoft KB Archive/158541

= PRB: C2440 Error When Using CMap and User Defined Key Type =

Article ID: 158541

Article Last Modified on 11/21/2006

-

APPLIES TO

 Microsoft Foundation Class Library 4.2, when used with:  Microsoft Visual C++ 4.0 Standard Edition

 Microsoft Visual C++ 4.1 Subscription 

-



This article was previously published under Q158541



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.

<div class="status_section">

STATUS
This behavior is by design.

<div class="moreinformation_section">

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;

Keywords: kbcollectionclass kberrmsg kbprb kbtemplate KB158541

-

[mailto:TECHNET@MICROSOFT.COM Send feedback to Microsoft]

© Microsoft Corporation. All rights reserved.