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 unintuitiv 😆

    Danke 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...


Log in to reply