[gelöst] Klassentemplate als Template-Argument
-
Hallo,
aus den Tiefen der Templateprogrammierung eine Frage:
Ich habe ein Klassentemplate, dass verschiedene Typen von zu versendenden Daten darstellt:
template <typename T> class DatenZumVersenden { virtual void versende(Protokoll*); };und das Protokoll enthält Funktionen, um verschiedene dieser Daten zu versenden:
class Protkoll { virtual void verschicke(DatenZumVersenden<int>& daten); virtual void verschicke(DatenZumVersenden<float>& daten); //usw... };Jetzt gibt es aber verschiedene Ausprägungen von zu versendenen Daten, die unterschiedliche "Metadaten" mit sich herumschleppen. Da diese Metadaten sehr unterschiedlich sind, macht es keinen Sinn, Protokolle von Protokoll erben zu lassen, da ich sonst dynamic_cast machen müsste, um von DatenZumVersenden<T> auf SpezielleDatenZumVersenden<T> zu kommen.
Daher habe ich eine Art "Mixin" konstruiert:
template<template <class U> class T> class ProtokollAdapter { virtual void versende(T<int>& daten); virtual void versende(T<float>& daten); };und die dazugehörigen Daten:
template <typename T> class DatenZumVersenden { virtual void versende(Protokoll<DatenZumVersenden>*); };Jetzt ist das erstellen eines neue Protokolls dann sehr einfach und vorallem ohne dynamic_casts möglich:
class SpeziellesProtokoll: public ProtokollApater<SpezielleDaten>{ virtual void versende(SpezielleDaten<int>& daten); };Doch grau ist alle Theorie.
Das Problem ist, dass der Compiler es nicht bei Klassentemplates belässt und implizit das template Argument "hinschreibt".
Der genaue Fehler ist:
virtual void versende(Protokoll<DatenZumVersenden>*);error: template argument 1 is invalid error: type/value mismatch at argument 1 in template parameter list for ‘template<template<class U> class T> class ProtokollAdapter’ error: expected a class template, got ‘DatenZumVersenden<T>’Also
virtual void versende(Protokoll<DatenZumVersenden>*);wird für den Kompiler implizit zu
virtual void versende(Protokoll<DatenZumVersenden<T> >*);Wo liegt mein Denkfehler?
Gruß,
Phil
-
Na dann geb ich mir mal selbst die Antwort (google ist mein Freund).
Ersetze
virtual void versende(Protokoll<DatenZumVersenden>*);durch
virtual void versende(Protokoll< ::DatenZumVersenden>*);Man beachte das Leerzeichen zwischen < und ::