queue für template instancen



  • Hallo zusammen,

    ich habe mal ne Frage. Ich habe ne ganze Menge Timer-Klassen, welche alle von einem Timer-Template-Typ abgeleitet sind. Bisher habe ich für jeden Sub-Typ eine Eigene Queue angelegt. Die Timer unterscheide ich über eine Referenz, welche ich als Schlüssel für die Queue nutze. Nun sind es aber immer nur ein oder zwei Timer pro Typ, welche gleichzeitig aktiv sind. Daher hab ich überlegt, ob man die Timer nicht alle in die selbe Queue speichern kann, und diese quasi auf den generischen Basistyp typisiert. Ich bekomme es aber nicht hin. Geht es, oder muß ich bei meinen zig Queues bleiben?

    Die Queue ist definiert wie folgt:

    template <typename KEY, typename TIMER=ReferenceTimer<KEY> >
            class ReferenceTimerQueue : public PairQueue<KEY, TIMER>{}
    

    Bisher habe ich die Queue immer wie folgt angelegt:

    ReferenceTimerQueue<VirtualLogicalTime, TimerA * >  timerAQueue;
    ReferenceTimerQueue<VirtualLogicalTime, TimerB * > timerBQueue;
    ...
    [/cpp]
    Nun würde ich gerne dies zusammenfassen zu:
    [code="cpp"]
    ReferenceTimerQueue<VirtualLogicalTime, ReferenceTimer * > timerQueue;
    

    Da sagt er aber immer: error: template argument 2 is invalid

    Geht es doch irgendwie??? 🙂

    Vielen Dank schonmal.


  • Mod

    Da sagt er aber immer: error: template argument 2 is invalid

    Nun, dann ist die offensichtliche Erklaerung, dass ReferenceTimer kein (zum Deklarations-Zeitpunkt) bekannter Typ ist.

    ReferenceTimer darf auch nicht (wie der Name im Uebrigen impliziert) ein Referenztyp sein, weil es in C++ natuerlich keine Zeiger auf Referenzen gibt. Also: Wie ist ReferenceTimer definiert?



  • Stimmt, hab ich vergessen anzugeben:

    template <typename T>
            class ReferenceTimer : public Timer {
            public:
    
                ReferenceTimer(Service & aService);
                ReferenceTimer(const ReferenceTimer<T>& orig);
    
                virtual ~ReferenceTimer();
    [...]
                virtual void setReference(const T & ref);
                T getReference();
    
            };
    

    also so im wesentlichen. Klar, ReferencTimer ist nen Template. Ich dachte, man kann dieses als quasi Interface verwenden. Also der zu speichernde Timer muß vom Typ ReferenceTimer sein (da dieser alles hat, was ich brauche).



  • ReferenzTimer heißt das ding auch nur, weil es eine Reference auf ein Ereignis speichert. Somit also der Zeiger ein bestimmtes Ereignis referenziert.


  • Mod

    Also der zu speichernde Timer muß vom Typ ReferenceTimer sein (da dieser alles hat, was ich brauche).

    ReferenceTimer ist kein Typ. Sondern ein Klassentemplate. Du must schon Template-Argumente angeben 😉

    Vielleicht willst du eine Basisklasse erstellen, die schon alles hat was du brauchst, und von der ReferenceTimer ableitet? Was ist den mit Timer ?

    Oder vielleicht willst du einfach ein Template als Template-Parameter? Ohne Zeiger? Also so in der Richtung:

    template <typename KEY, template<typename T> class TimerTempl >
            class ReferenceTimerQueue : public PairQueue<KEY, TimerTempl</* hier kommen die Argumente rein */> >{}
    

Anmelden zum Antworten