Re: CMap and struct
Now you have two problems;
* == operator is not const [it is required because inside CMap are compared
constant objects]. So make it const.
* The HashKey function inside CMap cannot produce any hash value from
SDataType objects; SDataType objects should be able to turn into integer
value somehow [to calculate the hash code]. So define a DWORD operator
returning some unique value (usually returning the object's address will do).
After all, the following code is working;
struct SDataType {
unsigned long nNamespace;
unsigned long nDataType;
SDataType& operator = (const SDataType &s2)
{
nNamespace = s2.nNamespace;
nDataType = s2.nDataType;
return *this;
}
bool operator == (const SDataType &s2) const
{
return ((nNamespace == s2.nNamespace) && (nDataType == s2.nDataType));
}
operator DWORD_PTR () { return (DWORD_PTR ) this; }
};
typedef CMap<SDataType, SDataType &, UINT , UINT> CDataMap;
CDataMap myMap;
And another thing, you should check for equallity at the first line of
assignment operator to avoid harmful consequences of a=a statements;
if (this == &s2) return *this;
--
======
Arman
"Vahid" wrote:
Thanks for your reply Joseph.
I have already tried a few combinations such as the one you suggested.
Yours will create the following errors:
error C2440: 'type cast' : cannot convert from 'SDataType' to
'DWORD_PTR' (refers to the "return" line in
template<class ARG_KEY>
AFX_INLINE UINT AFXAPI HashKey(ARG_KEY key)
{
// default identity hash - works for most primitive values
return (DWORD)(((DWORD_PTR)key)>>4);
}
)
plus the following error:
error C2678: binary '==' : no operator found which takes a left-hand
operand of type 'const SDataType' (or there is no acceptable
conversion)
D:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\atlmfc
\include\afxtempl.h(1544) : see reference to function template
instantiation 'BOOL CompareElements<KEY,SDataType>(const TYPE *,const
ARG_TYPE *)' being compiled
with
[
KEY=SDataType,
TYPE=SDataType,
ARG_TYPE=SDataType
]
refering to
template<class TYPE, class ARG_TYPE>
BOOL AFXAPI CompareElements(const TYPE* pElement1, const ARG_TYPE*
pElement2)
{
ASSERT(AfxIsValidAddress(pElement1, sizeof(TYPE), FALSE));
ASSERT(AfxIsValidAddress(pElement2, sizeof(ARG_TYPE), FALSE));
return *pElement1 == *pElement2; // this line
}