C++ 头文件中的模板专门化
我意识到我必须把下面的代码(用于模板专门化)放在CPP文件而不是头文件中?有什么方法可以在头文件中创建它吗C++ 头文件中的模板专门化,c++,C++,我意识到我必须把下面的代码(用于模板专门化)放在CPP文件而不是头文件中?有什么方法可以在头文件中创建它吗 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 pic
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);
}
模板内联UINT AFXAPI哈希键(常量错误\u代码和e)
{
//MFC CMap所需的哈希代码方法。
//此哈希代码生成方法摘自Joshua Bloch的
//有效的Java。
无符号uuu int64结果=17;
结果=37*结果+e.hi;
结果=37*结果+e.lo;
返回静态_cast(结果);
}
如果将上述函数置于error_code.h中,我将得到错误
错误C2912:显式专门化;
'UINT HashKey(常量
错误代码&“不是专门化
函数模板的定义
关于我为什么需要进行上述模板专门化的一些参考资料。以下代码摘自本文,是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);
}
//内部
模板
AFX_内联UINT AFXAPI哈希键(ARG_键)
{
//默认标识哈希-适用于大多数基本值
返回(DWORD)(((DWORD_PTR)键)>>4);
}
我认为您必须在头文件中执行此操作
//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);
}
//您忘记编写的模板非专用版本!
//编译器必须在专门的编译器之前知道它!
模板内联UINT AFXAPI HashKey(te);
//那就做专业化吧!
模板内联UINT AFXAPI哈希键(常量错误\u代码&e)
{
//MFC CMap所需的哈希代码方法。
//此哈希代码生成方法摘自Joshua Bloch的
//有效的Java。
无符号uuu int64结果=17;
结果=37*结果+e.hi;
结果=37*结果+e.lo;
返回静态_cast(结果);
}
编辑:
在阅读编辑的部分后,我认为您需要删除
inline
关键字。不过我不确定。试试看。:-) 我认为这意味着在专门化之前,您还没有定义函数的模板版本。我认为最好的做法是将其放在自己的头文件中,并在其前面包含error.h和hashkey.h文件。或者您可能只是有错误。h include hashkey.h。那么,非专门化版本是什么?这样做一个转发声明真的足够了吗?但是还要确保任何可能实例化该模板专门化的代码都已经看到了您的专门化定义。