Problem mit Templatebasierter Dialogklasse



  • Hi Leute,
    Ich hab ne Templateklasse, die zwei Templateparameter erwartet. Diese Klasse ist von CDialog abgeleitet. Jetzt hab ich ein Problem: Ich muss bei diversen Makros (z.B. BEGIN_MESSAGE_MAP) ja die Klasse übergeben. Das tut aber nicht:

    BEGIN_MESSAGE_MAP(template<class Encoder,class Decoder>CDlgSelectImageQuality<Encoder,Decoder>, CDialog) // Zeile 53
    

    führt zu:

    DlgSelectJpegQuality.cpp(53) : warning C4002: too many actual parameters for macro 'BEGIN_MESSAGE_MAP'
    DlgSelectJpegQuality.cpp(53) : error C2059: syntax error : ''template<''
    DlgSelectJpegQuality.cpp(53) : error C2653: 'Encoder' : is not a class or namespace name
    DlgSelectJpegQuality.cpp(53) : error C2143: syntax error : missing ';' before '{'
    DlgSelectJpegQuality.cpp(53) : error C2447: missing function header (old-style formal list?)
    DlgSelectJpegQuality.cpp(53) : error C2059: syntax error : ''template<''
    DlgSelectJpegQuality.cpp(53) : error C2653: 'Encoder' : is not a class or namespace name
    DlgSelectJpegQuality.cpp(53) : error C2653: 'Encoder' : is not a class or namespace name
    DlgSelectJpegQuality.cpp(53) : error C2143: syntax error : missing ';' before '}'
    DlgSelectJpegQuality.cpp(53) : error C2653: 'Encoder' : is not a class or namespace name
    DlgSelectJpegQuality.cpp(53) : error C2653: 'Encoder' : is not a class or namespace name
    DlgSelectJpegQuality.cpp(53) : error C2653: 'Encoder' : is not a class or namespace name
    DlgSelectJpegQuality.cpp(53) : error C2143: syntax error : missing ';' before '<'
    DlgSelectJpegQuality.cpp(53) : error C2143: syntax error : missing ';' before '<'
    DlgSelectJpegQuality.cpp(53) : error C2653: 'Encoder' : is not a class or namespace name

    und Folgefehler in späteren Zeilen.

    template<class Encoder,class Decoder>
    BEGIN_MESSAGE_MAP(CDlgSelectImageQuality<Encoder,Decoder>, CDialog) // Zeile 53
    

    klappt genauso wenig:

    DlgSelectJpegQuality.cpp(53) : warning C4002: too many actual parameters for macro 'BEGIN_MESSAGE_MAP'
    DlgSelectJpegQuality.cpp(53) : error C2143: syntax error : missing ',' before '<end Parse>'
    DlgSelectJpegQuality.cpp(53) : error C2143: syntax error : missing '>' before '{'
    DlgSelectJpegQuality.cpp(53) : error C2143: syntax error : missing ',' before 'const/volatile'
    DlgSelectJpegQuality.cpp(53) : error C2143: syntax error : missing ';' before '{'
    DlgSelectJpegQuality.cpp(53) : error C2143: syntax error : missing '>' before ';'
    DlgSelectJpegQuality.cpp(53) : error C2976: 'CDlgSelectImageQuality' : too few template arguments
    dlgselectjpegquality.h(60) : see declaration of 'CDlgSelectImageQuality'
    DlgSelectJpegQuality.cpp(53) : error C2143: syntax error : missing ',' before '='
    DlgSelectJpegQuality.cpp(53) : error C2143: syntax error : missing '>' before '{'
    DlgSelectJpegQuality.cpp(53) : error C2143: syntax error : missing '>' before '}'
    DlgSelectJpegQuality.cpp(53) : error C2976: 'CDlgSelectImageQuality' : too few template arguments
    dlgselectjpegquality.h(60) : see declaration of 'CDlgSelectImageQuality'
    DlgSelectJpegQuality.cpp(53) : error C2143: syntax error : missing '>' before '}'
    DlgSelectJpegQuality.cpp(53) : error C2275: 'CDlgSelectImageQuality<class ?? ::`generic-type-262' [0]>' : illegal use of this type as an expression
    DlgSelectJpegQuality.cpp(53) : error C2143: syntax error : missing ',' before '='
    DlgSelectJpegQuality.cpp(53) : error C2143: syntax error : missing '>' before '{'

    Und mein letzter Versuch:

    typedef template<class Encoder,class Decoder>CDlgSelectImageQuality<Encoder,Decoder> Test; // Zeile 51
    BEGIN_MESSAGE_MAP(Test, CDialog) // Zeile 53
    

    tut auch nciht:

    DlgSelectJpegQuality.cpp(51) : error C2059: syntax error : ''template<''
    DlgSelectJpegQuality.cpp(51) : error C2065: 'Encoder' : undeclared identifier
    DlgSelectJpegQuality.cpp(51) : error C2065: 'Decoder' : undeclared identifier
    DlgSelectJpegQuality.cpp(53) : error C2653: 'Test' : is not a class or namespace name
    DlgSelectJpegQuality.cpp(53) : error C2248: 'messageMap' : cannot access protected member declared in class 'CDialog'
    d:\programme\microsoft visual studio\vc98\mfc\include\afxwin.h(2667) : see declaration of 'messageMap'
    DlgSelectJpegQuality.cpp(53) : error C2653: 'Test' : is not a class or namespace name
    DlgSelectJpegQuality.cpp(53) : error C2270: 'GetMessageMap' : modifiers not allowed on nonmember functions
    DlgSelectJpegQuality.cpp(53) : error C2653: 'Test' : is not a class or namespace name
    DlgSelectJpegQuality.cpp(53) : error C2065: 'messageMap' : undeclared identifier
    DlgSelectJpegQuality.cpp(53) : error C2653: 'Test' : is not a class or namespace name
    DlgSelectJpegQuality.cpp(53) : error C2373: 'messageMap' : redefinition; different type modifiers
    DlgSelectJpegQuality.cpp(53) : error C2653: 'Test' : is not a class or namespace name
    DlgSelectJpegQuality.cpp(53) : error C2653: 'Test' : is not a class or namespace name
    DlgSelectJpegQuality.cpp(53) : error C2065: '_messageEntries' : undeclared identifier
    DlgSelectJpegQuality.cpp(53) : error C2109: subscript requires array or pointer type
    DlgSelectJpegQuality.cpp(53) : error C2102: '&' requires l-value
    DlgSelectJpegQuality.cpp(53) : error C2653: 'Test' : is not a class or namespace name
    DlgSelectJpegQuality.cpp(53) : error C2040: '_messageEntries' : 'const struct AFX_MSGMAP_ENTRY []' differs in levels of indirection from 'int'

    Bedeutet das, dass man keine TemplateDialogklassen verwenden kann? Oder bin ich nur zu doof? Falls ja, bitte helft mir 🙂



  • *g* Ich hab's geschafft ...
    Hab selbst Präprozessor gespielt und das Marko aufgelöst und dann eingesetzt, wie ich's gebraucht hab:

    template<class Encoder,class Decoder>
    const AFX_MSGMAP* CDlgSelectImageQuality<Encoder,Decoder>::GetMessageMap() const
    { return &CDlgSelectImageQuality<Encoder,Decoder>::messageMap; }
    template<class Encoder,class Decoder>
    AFX_COMDAT AFX_DATADEF const AFX_MSGMAP CDlgSelectImageQuality<Encoder,Decoder>::messageMap =
    { &CDialog::messageMap, &CDlgSelectImageQuality<Encoder,Decoder>::_messageEntries[0] }
    

    Ganz easy 😉


Anmelden zum Antworten