CDialogなどのMFCクラスからC++テンプレートクラスを派生して使用することは可能ですか?私は試しましたが、実装は、メッセージルーティングに使用されたMFCマクロで処理されます。例えば;テンプレートでMFCマクロを使用する
template<class TYPE, class ARG_TYPE>
class CMyDialogT : public CDialog
{
public:
CMyDialogT(CMyContainerT<TYPE,ARG_TYPE> *pData,CWnd* pParent = NULL);
CMyContainerT<TYPE,ARG_TYPE> *m_pData;
// Generated message map functions
//{{AFX_MSG(CMyDialogT)
afx_msg void OnUpdateMyControl();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
template<class TYPE, class ARG_TYPE>
CMyDialogT<TYPE,ARG_TYPE>::CMyDialogT(CMyContainerT<TYPE,ARG_TYPE> *pData,CWnd* pParent)
: CDialog(CMyDialogT::IDD, pParent)
{
m_pData = pData;
}
BEGIN_MESSAGE_MAP(CGlobalEditT<TYPE,ARG_TYPE>, CDialog)
//{{AFX_MSG_MAP(CGlobalEditT)
ON_EN_UPDATE(IDC_MY_CONTROL, OnUpdateMyControl)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
上記のメッセージは、次のような順序でコンパイルされません。
warning C4002: too many actual parameters for macro 'BEGIN_MESSAGE_MAP'
error C2653: 'TYPE' : is not a class or namespace name
手動でMFCマクロを巻き出す以外に、このための任意の回避策は、ありますか?この時点ではテンプレートの特殊化は使用できません(similar question hereで指定されています)。TYPEおよびARG_TYPEの可能な値がすべてわからないためです。
質問を見るもう1つの方法は、「テンプレートを特化したり、ホストクラスをテンプレートクラスにすることなく、別のクラスにテンプレートクラスを埋め込むことはできますか?私はどちらか、このいずれかを答えることができない、私は答えはあなたがBEGIN_TEMPLATE_MESSAGE_MAP代わりのBEGIN_MESSAGE_MAPを使用する必要がMSDN here
+1ありがとうございますが、上記のサンプルコードのように、複数のテンプレート引数では機能しません。 –
私の余分なテンプレート引数を取り除きました。 –
あなたのコードをチェックしなかった、申し訳ありません...私はメッセージマップとテンプレートを読み、BEGIN_TEMPLATE_MESSAGE_MAPについて考えました。とにかく、あなたがあなたの問題を解決したことを知ってよかった! –