Vorlage-Klasse in der Klasse-Vorlage in c++
noob hier noch am Experimentieren mit Vorlagen. Beim schreiben einer Nachricht, die Verarbeitung Klasse Vorlage
template <typename T> class MessageProcessor {
//constructor, destructor defined
//Code using t_ and other functions
foo( void ) {
//More code in a perfectly fine method
}
private: T *t_
};
Alle definiert in der header-Datei. Ich habe gebaut und getestet meiner Klasse und alles ist gut. Nun, ich bin versucht, dies zu tun:
template <typename T> class MessageProcesor {
//Same stuff as before
foo(void) {
//Same code as before in foo, but one new line:
t_->getMessageSender<MessageType>();
}
private: T *t_;
};
Allerdings, diese Zeile gibt mir eine Fehlermeldung von schlechten Ausdruck-Typ, bevor '>' token.
Habe ich die erforderlichen header-Dateien definieren, was ein MessageType ist. Ich habe diese Funktion oft vor, nur nicht in diesem Zusammenhang.
Ich vermute, dass der compiler nicht, wie die Tatsache, dass die template-Funktion ist vollständig definiert (spezialisierte?) innerhalb einer undefinierten Klasse Vorlage (unspezialisierten?). Ich bin nicht voll grokking was macht ein template 'spezialisiert'. Die meisten Erklärungen center auf die Konzepte der 'voll' oder 'teilweise', nicht aber, was macht es spezialisiert in den ersten Platz.
Entschuldige mich, wenn Sie möchten, um zu sehen, mehr code. Ich habe kein internet bei der Arbeit, und das ist, wo ich bin, dies zu tun, so habe ich alles in meine geistige 'scratchpad' - und bringen es nach Hause.
Lebensmittel nicht über eine Rückkehr geben, dann ist das dein problem
Sie sind alle richtig in Ihren Beobachtungen. Allerdings waren Tippfehler. Das eigentliche problem war das fehlen der 'template' - Schlüsselwort in der Form beantwortet von Faisal
InformationsquelleAutor user106740 | 2009-07-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre member-Funktion 'foo' muss eine Rückkehr, und Sie müssen, verwenden Sie das Schlüsselwort "Vorlage", wenn Sie member-templates in den abhängigen Ausdrücke (Ausdrücke, deren Bedeutungen stützen sich direkt oder indirekt auf eine generische template-parameter)
Vielleicht ist dieses Beispiel wird Ihnen helfen, zu schätzen, wenn ein Mitglied die Vorlage muss vorangestellt werden, die von der 'Vorlage' Schlüsselwort [Hinweis: im Interesse der Symmetrie können Sie immer mit der "Vorlage" - Präfix an die Vorlagen, aber es ist optional, wenn auf einer nicht-abhängigen expression.
Hoffe, das hilft.
Die Norm verlangt, dass das 'template' - Präfix nur beim Zugriff auf member-templates aus einem Bezeichner, hängt von einer template-parameter - die meisten Compiler sollte dies richtig, da ein Teil der standard seit '98 - '03 veränderten Sie die Regeln der Einfachheit halber so, dass Sie es verwenden können, auf alle Mitgliedstaaten bei der Vorlage zugreift - und abgesehen von der EDG-Compiler (das tun Sie meist das richtig) habe ich nicht überprüft, bei einer der anderen Compiler - bitte lassen Sie mich wissen, wenn Sie haben.
InformationsquelleAutor Faisal Vali
Fügen Sie das Schlüsselwort
template
zwischen->
und den Namen der template-Methode:InformationsquelleAutor Paolo Capriotti
Wahrscheinlich, MessageType ist nicht bekannt zu diesem Zeitpunkt. Fehlt ein include, ein namespace-Auflösung oder eine Erklärung?
wenn tht ist es nicht, wie ist
getMessageSender
erklärt, und wie istMessageType
?Allgemein, in C++ ist es kein problem, wenn T nicht bekannt ist, an diesem Punkt (naja... es ist kompliziert, aber immer noch).
Auch, die Fehlermeldung enthält in der Regel den Typ, für den es versucht wird, werden insantiated. Versuchen, nach der vollständigen Fehlermeldung zumindest.
InformationsquelleAutor peterchen
Haben Sie weitere ähnliche Aufrufe von Methoden wie getMessageSender, templatized?
InformationsquelleAutor ralphtheninja
Es ist nur der Rückgabetyp der Funktion, die fehlt. Die
t_
Mitglied voll definiert ist.Eine Spezialisierung einer template ist eine 'spezielle' version Ihres Arbeitsgerätes für bestimmte template-Argumente. Ein Beispiel:
std::vector
ist die spezialisierte version der generischenstd::vector
.Einer teilweisen Spezialisierung ist eine Implementierung der generischen code, wo nicht alle template-Argumente bereitgestellt.
InformationsquelleAutor xtofl
Dies funktioniert gut auf Visual Studio 2010 compiler.
Nur, um der Antwort auf dem Laufenden !!!
InformationsquelleAutor Mahesh