Ich habe ein sehr seltsames Problem. Um die Dinge einfach zu halten, kann sagen, dass ich eine Funktion haben will, die als ArgumentLambda als Vorlage Funktion
2 Funktionen mit der gleichen Erklärung nimmttemplate<typename Func>
void foo(Func a, Func b)
{
std::cout << "good";
}
zu versuchen, die Dinge heraus, dass ich putchar
aus cstdio nahm, und erstellt eine identische Funktion, um die putchar
zu entsprechen.
Nun möchte das Lambda nicht kompilieren (der Schlüssel ist, ich möchte Lambda Capture verwenden).
Also lassen Sie Vorlage Spezialisierung hinzufügen, weil der Programmierer weiser als die Maschine ist, richtig? :)
template<typename Func>
void foo(Func a, Func b)
{
std::cout << "good";
}
template<>
void foo(int(*)(int), int(*)(int))
{
std::cout << "good";
}
Kein Glück, der gleiche Fehler - warum? Aber aus irgendeinem Grund, wenn ich die Vorlage Spezialisierung auf Kommentar:
//template<>
void foo(int(*)(int), int(*)(int))
{
std::cout << "good";
}
Der Code kompiliert. Ich möchte natürlich nicht foo
für jede Reihe von Funktionen Argumente überladen - das ist, was Vorlagen sind. Jeder Schritt wurde sowohl mit msvC++ als auch mit g ++ getestet. Was mache ich falsch?
* "Typen zerfallen nicht, wenn Template-Typen herzuleiten" * natürlich sie tun. * "Aus demselben Grund, in dem ein String-Literal als char [N] anstelle von const char *" * abgeleitet wird, wird ein roher String-Literal als const char * –
@PiotrSkotnicki abgeleitet, wann kommt er dann als Char-Array? Ich habe gerade darüber in einer anderen Frage gelesen. – xaxxon
Wenn ein Funktionsparameter vom Referenztyp ist –