2011-01-05 3 views
4

Я понимаю, что я должен поставить нижеприведенный код (для специализации шаблона) в файл 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

Я думаю, вы должны сделать это в своем заголовочном файле.

//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); 
} 

EDIT:

После прочтения отредактированной части, я думаю, вам нужно удалить inline ключевое слово. Я не уверен, хотя. Попытайтесь это сделать. :-)

+0

Достаточно ли сделать такое объявление вперед? –

+1

@ Mark Ransom: Да! – Nawaz

+0

Но также убедитесь, что * любой * код, который может создать экземпляр этой специализации шаблона, уже видел ваше определение специализации. – aschepler

2

Я думаю, что все это означает, что вы не определили версию шаблона функции до специализации. Я думаю, что лучшим способом было бы поместить это в свой собственный заголовочный файл, а #include - файлы error.h и hashkey.h перед ним. Или вы можете просто error.h включить hashkey.h.

Смежные вопросы