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.
-
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?
-
Können wir mal dafür einen FAQ Beitrag errichten? Kommt ja mittlerweile fast täglich.
-
wie ich schon schrieb, T = Bar<int>, dann geht's, will das aber nicht jedes mal doppelt schreiben.
-
(!) schrieb:
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.
-
wie ich schon schrieb, T = Bar<int>
Jo. Oder
T = Bar<float>
. OderT = 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 wasT
sein könnte. Vielleicht passt sogaridentity<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.