gpt4 book ai didi

c++ - 头文件中的模板特化

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:57:40 25 4
gpt4 key购买 nike

我意识到我必须将下面的代码(用于模板特化)放在 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中,我会得到错误

error C2912: explicit specialization; 'UINT HashKey(const error_code &)' is not a specialization of a function template

关于为什么我需要进行上述模板特化的一些引用资料。 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);
}

最佳答案

我认为您必须在头文件中执行此操作。

//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 关键字。不过我不确定。尝试这样做。 :-)

关于c++ - 头文件中的模板特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4600643/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com