Funktionstemplates in Klassen-Templates



  • Hi zusammen

    ich stehe gerade etwas auf dem Schlauch.

    Ich habe eine Klasse, die einen Typ T in einer bestimmten Form in einen Puffer schreibt.
    Dieser Typ ist manchmal ein uint_8 oder ein uint_64. Das schreiben geschieht mittels ParameterPack.
    Nun soll diese Klasse ein Template werden, damit der Puffer-Typ variabel sein kann.

    Wie würde man die Funktionstemplates dann in dem Fall implementieren? Der Template-Specifier ist ja in der Funktion dann quasi schon vorhanden, durch das ParameterPack....
    So wie ich es hier gemacht habe, indem ich einfach "class C" dem template-Specifier hinzugefügt habe, kompiliert es nicht.

    template <class C>
    class BufferWriter
    {
    public:
        BufferWriter( C &buf_ ) : Buf( buf_ ) {}
        ~BufferWriter() {}
    
        // Schreiboperationen
        template <typename ... Args> void write( uint64_t, Args... );
        template <typename ... Args> void write( uint8_t, Args... );
        void write() {}
    
    private:
        C &Buf;
    };
    
    template <class C, typename ... Args>
    void BufferWriter::write( uint64_t value, Args...args )
    {
    }
    
    template <class C, typename ... Args>
    void BufferWriter::write( uint8_t value, Args...args )
    {
    }
    


  • Nee alles gut. Ich war nur kurz verwirrt.
    Es geht natürlich so:

    template <class C>
    template <typename ... Args>
    void BufferWriter<C>::write( uint64_t value, Args...args )
    {
    }
    
    template <class C>
    template <typename ... Args>
    void BufferWriter<C>::write( uint8_t value, Args...args )
    {
    }
    
    


  • Wobei die spezialisierten Funktionen nicht kompilieren. Scheinbar hat der Compiler in Templates ein Problem mit derartigen Funktionstemplates...

    template <class C>
    template <>
    uint8_t BufferWriter<C>::read<uint8_t>( BufferOffset &pos )
    

    Er sagt:
    invalid explicit specialization before '>' token



  • Du musst auch das äußere C spezialisieren, wenn du das innere template spezialisieren willst.

    Siehe hier inkl. Vorschlag, wie du es dennoch machen kannst:
    https://stackoverflow.com/questions/6773302/specialization-of-templated-member-function-in-templated-class



  • Wir wäre es die Write Funktion als Template auszulagern?


Log in to reply