Funktionstemplate in Klassentemplate mit Parameterpacks
-
Ich habe ein Klassentemplate mit einem Parameterpack, das wiederum eine Funktion enthält, die ein anderes Parameter Pack mitbringt.
template<typename... Args> class Dummy { public: template <typename ...Args2> void test( Args2 ... ); }; template <typename... Args, typename ...Args2> void Dummy<Args>::test( Args2 ... ) { }
Für die Implementation der Methode bemängelt der Compiler:
invalid use of incomplete type 'class Dummy<Args>'Ich bekomme irgendwie die Syntax nicht richtig hin. Ich dächte eigentlich, so wie ich es gemacht habe, müsste es richtig sein...
Kann mir bitte jemand auf Sprünge helfen?
-
Du mußt die
template
verschachteln:template <typename... Args> template <typename... Args2> void Dummy<Args>::test( Args2 ... ) { }
-
@Th69 sagte in Funktionstemplate in Klassentemplate mit Parameterpacks:
template <typename... Args>
template <typename... Args2>
void Dummy<Args>::test( Args2 ... )
{
}Das hab ich probiert. Das funktionierte ebenfalls nicht, mit der gleichen Fehlermeldung.
Das hier ging
template <> template <typename... Args2> void Dummy<>::test( Args2 ... ) { }
Aber so richtig Vertrauen hab ich da nicht. Ich befürchte ich bekomme dann im Nachgang andere Compiler-Meldungen, weil ich an anderen Stellen immer präzise mit Dummy<Args> arbeite und nicht mit Dummy<>.
Zur info: die Signatur der Funktion im Projekt ist eigentlich diese:template <typename... Args2>
Dummy<Args> &Dummy<Args>::test( Args2 ... )also ich habe einen Rückgabe-Wert "*this", weils eigentlich ein stream-Operator ist. Ich habe zu Testzwecken auf "void test" reduziert.
-
So hast du ja eine Spezialisierung definiert.
Klappt es denn fehlerfrei als Inline-Funktion?
template<typename... Args> class Dummy { public: template <typename ...Args2> void test( Args2 ... ) { } };
Die Fehlermeldung "invalid use of incomplete type 'class Dummy<Args>'" deutet auch eher auf eine unvollständige Klassendeklaration hin.
Edit: Ideone gibt als Fehler auch folgendes aus:
prog.cpp:13:6: error: parameter packs not expanded with ‘...’:
void Dummy<Args>::test( Args2 ... )"Daher ist die Lösung so (s.a. Ideone-Code):
template <typename... Args> template <typename... Args2> void Dummy<Args...>::test( Args2 ... ) { }
-
@Th69 Als Inliner funzt es. Ich probiere mal deine zweite Lösung.
Die C++-Syntax ist in manchen Fällen einfach sehr unintuitivDanke dir erstmal.
Ich probiere gerade viel mit Variadics rum weil man damit natürlich gut Compile-Time-Shit machen kann, aber man stößt auch relativ schnell an die Grenzen der intuitiven Syntax...