头文件中的模板特化

时间:2011-01-05 03:42:23

标签: c++

我意识到我必须将下面的代码(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);
}

2 个答案:

答案 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。