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
}


.



Relevant Pages

  • Making Datatypes Constant and Emulating Const Correctness
    ... Being relatively new to Perl with Java and bits of C under my belt, ... I'm new to C+++, too, but remember a number of uses for the const keyword ... an array to some analizer function as a constant strongly signals that no ... some reference (e,g. a blessed hash reference) ...
    (comp.lang.perl.misc)
  • Re: Question about tcp hash function tcp_hashfn()
    ... But it still does not fix artifacts with for example const IP and random ... ports or const IP and linear port selection. ... Values must be specially tuned to be used with Jenkins hash, ...
    (Linux-Kernel)
  • Re: Hash value not correct in CryptVerifyDetachedMessageSignature
    ... > to verify it with Hash calculated using OpenSSL. ... const BYTE* pbDetachedSignBlob, ... DWORD cbDetachedSignBlob, ...
    (microsoft.public.platformsdk.security)
  • reversing a hash function
    ... I have this hash function: ... const b: longword; ... These two hash functions are the same and will always produce a value ...
    (sci.crypt)