Templates



  • Hallo zusammen!

    Ich habe eine generische Smartpointer-Klasse und eine generische Klasse für einen Ringpuffer.

    //Smartpointer
    template<class T> class CSmartPtr
    {
    };
    
    //Ringpuffer
    template<class T, unsigned int uiSize> class CBuffer
    {
    };
    

    Bis dahin is alles in bester Ordnung. Jetzt möchte ich einen Smartpointer auf ein Ringpufferobjekt zeigen lassen:

    CSmartPtr<CBuffer<int, 32>> buf;
    

    Auch das geht. Wenn ich aber jetzt aber folgendes mache, bekomme ich einen Fehler vom Compiler:

    CSmartPtr<CBuffer<int, 32>> buf = new CBuffer();
    

    Ich möchte das Pufferobjekt in dieser Zeile mit new anlegen, es funktioniert aber offensichtlich nicht.

    CSmartPtr und CBuffer sollen aber möglichst datentypunabhängig bleiben.

    Weiß jemand, wie ich aus dieser Misere rauskomme?



  • SuperAdmin schrieb:

    CSmartPtr<CBuffer<int, 32>> buf = new CBuffer();
    

    Ich möchte das Pufferobjekt in dieser Zeile mit new anlegen, es funktioniert aber offensichtlich nicht.

    Erstmal,
    CSmartPtr<CBuffer<int, 32>> ist kein C++98,
    CSmartPtr<CBuffer<int, 32> > aber schon.

    Und zweitens, CBuffer ist ein Klassen-Template und keine Klasse. Du musst die Template-Parameter schon mit angeben, wenn du ein Objekt erzeugen willst.



  • SuperAdmin schrieb:

    ...Wenn ich aber jetzt aber folgendes mache, bekomme ich einen Fehler vom Compiler...

    Toll, und sollen wir dir diese Meldung nun aus der Nase ziehen, oder was?

    Wobei ich denke den Fehler zu sehen:

    SuperAdmin schrieb:

    CSmartPtr<CBuffer<int, 32>> buf = new CBuffer();
    
    CSmartPtr<CBuffer<int, 32> > buf = new CBuffer<int, 32>();
    //                       [1]                  [   2   ]
    // 1 - Erst mit dem kommenden Standard kannst du hier das Leerzeichen
    //     weglassen. Je nach Compiler kann dies sonst als Streamoperator
    //     interpretiert werden.
    // 2 - CBuffer reicht nicht als Typangabe, da es ein Template ist.
    


  • OK, funktioniert! Eigentlich logisch, man muss halt nur drauf kommen.^^

    Besten Dank für eure Hilfe!



  • Um nicht dauernd die Template-Argumente explizit angeben zu müssen, kannst du typedef einsetzen. Typdefinitionen lohnen sich auch für die Wartung: Wenn du plötzlich den Typ leicht abänderst, brauchst du das nur an einer Stelle zu tun und der restliche Code bleibt kompatibel.

    typedef CBuffer<int, 32> IntBuffer; // evtl. auch CSmartPtr
    

    Übrigens würde ich von impliziter Konvertierung abraten, wenn du dem Smart-Pointer Besitz überträgst, denn diese ist immer fehleranfällig. Dazu müsstest du den Konstruktor explicit machen. Das nur so am Rande. 🙂


Anmelden zum Antworten