头文件中的模板特化

5
我意识到我需要将以下代码(用于模板专业化)放在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 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(const error_code&)'不是函数模板的特化。
以下是关于为什么需要进行上述模板特化的一些参考资料。 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);
}

1
那么,非专业版本是什么? - GManNickG
2个回答

5
我认为你需要在头文件中进行这个操作。
//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
这样做一个前向声明真的足够吗? - Mark Ransom
1
但是还要确保任何可能实例化该模板特化的代码已经看到了您的特化定义。 - aschepler

2

我认为这意味着在进行特化之前,您还没有定义函数的模板版本。我认为最好的做法是将其放在自己的头文件中,并在其前面#include错误.h和hashkey.h文件。或者您可以让错误.h包含hashkey.h。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接