2012-01-04 15 views
4

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

答えて

4

マクロとテンプレートのより一般的な問題は、マクロがStupid(tm)であるためです。

BEGIN_MESSAGE_MAP(CGlobalEditT<TYPE,ARG_TYPE>, CDialog) 

それに変換:

プリプロセッサは、マクロ呼び出しを解析するとき、したがって、オペレータをグループ化するよう<>又は[]の世話をしない

  • マクロ名:BEGIN_MESSAGE_MAP
  • 引数1 :CGlobalEditT<TYPE
  • 引数2:ARG_TYPE>
  • 引数3:CDialog

は、それが唯一の2つの引数を持つマクロで実現し、BEGIN_MESSAGE_MAPの定義を検索し、lowdly文句を言います。

これが発生する可能性がある状況の2つのタイプがあります。

  • クラスまたは関数
  • 内で実際に後者ではテンプレートクラスまたはテンプレート関数

を宣言するためには、特定のマクロが提供されていない限り、あなたは多かれ少なかれネジ留めされています。

前者の場合は、次の2つのソリューションがあります:カンマ を「隔離」するCGlobalEditT<TYPE,ARG_TYPE>周りにカッコを使用して、コンマ

  • が含まれていないCGlobalEditT<TYPE,ARG_TYPE>に同義語を提供するために、typedefを使用し

    中カッコが機能する場合は素晴らしいですが、必ずしもそうではありません。

    そうでない場合は、多くの場合、typedefが適しています。

    いずれにせよ、マクロについては何かを覚えておく必要があります。

  • 5

    上の単一のタイプのテンプレートの番号

    編集部分的な溶液であってもよいと思います。

    +1

    +1ありがとうございますが、上記のサンプルコードのように、複数のテンプレート引数では機能しません。 –

    +0

    私の余分なテンプレート引数を取り除きました。 –

    +1

    あなたのコードをチェックしなかった、申し訳ありません...私はメッセージマップとテンプレートを読み、BEGIN_TEMPLATE_MESSAGE_MAPについて考えました。とにかく、あなたがあなたの問題を解決したことを知ってよかった! –

    関連する問題