我意识到我必须将下面的代码(For template specialization)放在CPP文件中而不是Header文件中?有什么办法可以在Header文件中创建吗?
template<> inline UINT AFXAPI HashKey<const error_code &> (const error_code & e)
{
// Hash code method required for MFC CMap.
// This hash code generation method is picked from Joshua Bloch's
// Effective Java.
unsigned __int64 result = 17;
result = 37 * result + e.hi;
result = 37 * result + e.lo;
return static_cast<UINT>(result);
}
如果上面的函数放在error_code.h中,我会得到错误
错误C2912:显式专业化; 'UINT HashKey(常数 error_code&amp;)'不是专业化 功能模板
关于我为什么需要进行上述模板专业化的一些参考资料。 http://www.codeproject.com/KB/architecture/cmap_howto.aspx。下面的代码是从文章中挑选出来的,它是MFC源代码的一部分。
// inside <afxtemp.h>
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);
}
答案 0 :(得分:2)
我认为你要在头文件中执行此操作。
//template non-specialized version which you forgot to write!
//compiler must know it before the specialized ones!
template<typename T> inline UINT AFXAPI HashKey(T e);
//then do the specializations!
template<> inline UINT AFXAPI HashKey<const error_code &> (const error_code & e)
{
// Hash code method required for MFC CMap.
// This hash code generation method is picked from Joshua Bloch's
// Effective Java.
unsigned __int64 result = 17;
result = 37 * result + e.hi;
result = 37 * result + e.lo;
return static_cast<UINT>(result);
}
编辑:
阅读完编辑过的部分后,我认为您需要删除inline
关键字。我确实不。试着这样做。 : - )
答案 1 :(得分:2)
我认为所有这些意味着您在专业化之前没有定义函数的模板版本。我认为最好的做法是将它放在自己的头文件中,并#include
前面的error.h和hashkey.h文件。或者你可以只有error.h include hashkey.h。