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


Last Reviewed: August 2, 1999
© 2000 Microsoft Corporation. All rights reserved. Terms of Use.