Betrachten Sie das folgende Beispiel:Warum kann der C++ - Compiler keine Schablonenparameter ableiten?
template<typename TI>
char trunc(TI IN){
return (char)IN;
}
template <typename TO, typename TI>
TO applyf(TO (OP)(TI), TI IN){
return OP(IN);
}
template <typename TO, typename TI,
TO (OP)(TI)>
TO applyt(TI IN){
return OP(IN);
}
int main(){
int i = -21;
char r1 = applyf(trunc<int>, i);
char r2 = applyt<char, int, trunc>(i);
char r3 = applyt<trunc>(i);
}
Wenn ich diesen Code in g ++ (mit C++ 11) zu kompilieren, ich die Fehlermeldungen erhalten:
Function.cpp:21:12: error: no matching function for call to 'applyt'
char r3 = applyt<trunc>(i);
Function.cpp:13:4: note: candidate template ignored: invalid explicitly-specified argument for template parameter 'TO' TO applyt(TI IN){
Also meine Frage ist einfach: Das Eingabeargument Typ ist offensichtlich - ein int - und für mich sollte TO offensichtlich sein.
Warum können nicht TO und TI abgeleitet werden, aber sie können in r1 abgeleitet werden?
Der Compiler sagt ziemlich explizit Sie versuchen, 'trunc' mit' TO' übereinzustimmen. Die Vorlage hat drei Parameter, nicht einen, und es gibt keine Möglichkeit, dass OP aus dem Funktionsargument abgeleitet wird. – chris
Ich bin mir nicht sicher, was "offensichtlicher" darüber ist, ehrlich gesagt. –
Wo ist der Typ OP definiert? – Brandon