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 nameund 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