Template Argument Deduction funktioniert nicht



  • Hallo Leute,

    Folgendes Beispiel gibt mir den Fehler
    error C2783: 'void Foo(T::Type)' : could not deduce template argument for 'T'.
    Was mach ich falsch?

    template<typename T>
    void Foo(typename T::Type t)
    {
    }
    
    template<typename T>
    struct Bar
    {
    	typedef int Type;
    };
    
    int main()
    {
    	Foo(Bar<int>::Type());
    }
    

    Ich würde es gerne vermeiden ständig Foo<Bar<int>>(...) zu schreiben.


  • Mod

    Dein foo bekommt beim Aufruf ein int (denn Bar<int>::Type ist nunmal bei dir int) übergeben. Davon ausgehend, was für ein T sollte der Compiler deiner Meinung nach hier verwenden?


  • Mod

    Können wir mal dafür einen FAQ Beitrag errichten? Kommt ja mittlerweile fast täglich.



  • @camper

    wie ich schon schrieb, T = Bar<int>, dann geht's, will das aber nicht jedes mal doppelt schreiben.


  • Mod

    (!) schrieb:

    @camper

    wie ich schon schrieb, T = Bar<int>, dann geht's, will das aber nicht jedes mal doppelt schreiben.

    Ich glaube, du hast nicht verstanden, was Camper sagen wollte: Das Foo sieht nur einen int, der ihm übergeben wird. Woher soll es wissen, dass dieses das Type der Klasse Bar ist? Es kommt ja nirgendwo in Kontakt mit Bar.


  • Mod

    wie ich schon schrieb, T = Bar<int>

    Jo. Oder T = Bar<float> . Oder T = Bar<void> . Nebst der offensichtlichen Tatsache dass der Compiler kaum jede Spezialisierung durchprobieren (oder Deduzierung anhand der Definition des Typedefs vornehmen) kann hat er keinerlei Hinweise was T sein könnte. Vielleicht passt sogar identity<int> ?

    Um das Problem zu lösen, zeig den Kontext in dem du eine entsprechende Lösung gebrauchen würdest. Dann zeigen wir dir wie du den Kontext so abänderst das Lösungen dafür existieren.


Anmelden zum Antworten