2017-04-18 5 views
3

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?

+4

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

+0

Ich bin mir nicht sicher, was "offensichtlicher" darüber ist, ehrlich gesagt. –

+0

Wo ist der Typ OP definiert? – Brandon

Antwort

4

trunc ist eine Funktionsvorlage, kein Typ und kann daher nicht mit typename TO übereinstimmen.

Verwandte Themen