我有一个传统的MFC应用程序似乎以几种错误的方式使用转换为HashKey ......
有以下模板方法:
template<class ARG_KEY>
AFX_INLINE UINT AFXAPI HashKey(ARG_KEY key)
{
// (algorithm copied from STL hash in xfunctional)
ldiv_t HashVal = ldiv((long)(ARG_KEY)key, 127773);
HashVal.rem = 16807 * HashVal.rem - 2836 * HashVal.quot;
if (HashVal.rem < 0)
HashVal.rem += 2147483647;
return ((UINT)HashVal.rem);
}
它给我一个错误:
ldiv_t HashVal = ldiv((long)(ARG_KEY)key, 127773);
一个输出说:
error C2440: 'type cast' : cannot convert from 'GUID' to 'long'
如果是静态转换,则错误为cannot convert from 'HMENU' to 'long'
,这也是一个问题。
有没有办法投出long
??
感谢@Joachim Pileborg
在浏览了近100万行代码后,程序似乎只使用GUID
结构中的第一个变量。
因此,我根据预期重载了模板:
template<>
AFX_INLINE UINT AFXAPI HashKey<GUID>(GUID key)
{
return key.Data1>>4;
}
答案 0 :(得分:2)
这是创建专业化所必需的过程:
HashKey
对GUID
的使用结论是MFC 6.0中的原始版本使用了GUID
structure
的第一个元素(非常非常讨厌的转换)。 GUID
的第一个元素是long
类型,因此投射很好。
因此,我们创建了以下专业化在项目中,而不是在 MFC 库中:
template<>
AFX_INLINE UINT AFXAPI HashKey<GUID>(GUID key)
{
return key.Data1>>4;
}
这是HashKey
在项目中的使用方式。
答案 1 :(得分:1)
这是有风险的,但如果必须,你可以尝试:
long key1 = *(long*)(&key);