2011-01-05 20 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ハッシュキー(の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

@マークランソム:はい! – Nawaz

+0

また、テンプレートの特殊化をインスタンス化する可能性のある*コードが、あなたの特殊化定義を既に見ていることを確認してください。 – aschepler

2

私はこれがすべてあなたが特殊化の前に関数のテンプレートバージョンを定義していないことを意味すると思います。私は、最善の方法は、これを独自のヘッダーファイルに入れ、#includeの先頭にerror.hとhashkey.hファイルを入れることだと思います。あるいは、単にerror.hにhashkey.hをインクルードすることもできます。

関連する問題