Unklarer Fehler bei Funktionstemplate-Instanziierung



  • Hallo zusammen,

    ich habe folgende, statische Template-Methode in einer meiner Klassen:

    template<class T, class K>
    static long bs2(const vector<T>& v, K what, ECmpRes (*pfnCmp)(K, const T&))
    {
      // ...
    }
    

    ECmpRes ist dabei eine Enum. Diese Methode will ich nun wie folgt instanziieren/benutzen:

    long pos = CDisassembler::bs2(v, cur, &RatingPredicate);
    

    wobei "RatingPredicate" definiert ist als:

    static disasm::ECmpRes RatingPredicate(line_t& l, const SRating*& r2)
    {
      // ...
    }
    

    und v als const vector<SRating*>& v = ...; bzw. cur einfach als line_t (= typedef für unsigned int ).
    Wenn ich das allerdings kompiliere (gcc 4.6), erhalte ich:

    A.cpp: In Elementfunktion »void eval::CEvalExport::m_enumerateRatings()«:
    A.cpp:53:70: Fehler: keine passende Funktion für Aufruf von »disasm::CDisassembler::bs2(const std::vector<eval::SRating*>&, types::line_t&, disasm::ECmpRes (*)(types::line_t&, const eval::SRating*&))«
    A.cpp:53:70: Anmerkung: Kandidat ist:
    B.hpp:242:40: Anmerkung: template<class T, class K> static long int disasm::CDisassembler::bs2(const std::vector<T>&, K, disasm::ECmpRes (*)(K, const T&))
    make: *** [deptrack] Fehler 1
    

    Das Ganze ist mir sehr unverständlich, da wenn man T und K in der Fehlermeldung durch die "echten" Typen ersetzt, bekommt man exakt meinen Funktionsaufruf. Was übersehe ich da? (Habe das mal etwas gekürzt, damit nur das Wichtigste da steht.)

    Ich hab auch schon diverse Varianten durchprobiert, aber das will nicht so ganz funktionieren. Ich verstehe auch nicht, dass wenn ich die statische Methode so aufrufe, dass T = K ist, er das auch nicht kompiliert (analoge Fehlermeldung).

    Schonmal vielen Dank! 😉

    Viele Grüße
    Das Muster 🙂



  • Muster schrieb:

    Habe das mal etwas gekürzt, damit nur das Wichtigste da steht.

    Damit hast du auch das unwichtige weggekürzt, was den Fehler vermutlich verursacht. Poste doch mal bitte aufs Minimum gekürzten Code, der den Fehler aber noch enhält.



  • Benutze bei der Funktion RatingPredicate entweder "line_t" bzw "const line_t &" anstatt der "non-const reference" "line_t &".


  • Mod

    Der Compiler hat recht, es ist auch alles Wesentliche dabei.

    template<class T, class K>
    static long bs2(const vector<T>& v, K what, ECmpRes (*pfnCmp)(K, const T&))
    

    mit

    disasm::ECmpRes RatingPredicate(line_t& l, const SRating*& r2)
    

    als Funktionszeigerargument sehen wir, dass es kein T gibt, für dass der zweite Parameter const T& zu const SRating*& wird. Vermutlich ist das const in RatingPredicate falsch gesetzt und es war

    disasm::ECmpRes RatingPredicate(line_t& l, SRating* const& r2)
    

    gemeint. Die Deduktion von K ist ebenfalls mehrdeutig, wie schon zuvor gesagt.



  • Vielen Dank für eure Antworten, habe es jetzt hinbekommen. Die Ratschläge von Th69 und camper haben mein Problem gelöst. Danke euch beiden! 🙂

    Viele Grüße
    Das Muster


Log in to reply