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?