2014-10-01 14 views
6
#include <iostream> 
#include <ostream> 

template<typename T> 
void Func(const T& val) 
{ 
    std::cout << "const T& val\n"; 
} 

void Func(const char* p) 
{ 
    std::cout << "const char * p\n"; 
} 

void Func(std::ostream & (*manip)(std::ostream &)) 
{ 
    std::cout << "ostream\n"; 
} 

int main() 
{ 
    Func(std::endl); 
    Func("aaa"); 
} 

Osservazione:Come la funzione template sceglie i parametri?

1> Senza void Func(std::ostream & (*manip)(std::ostream &)), la linea Func(endl); causerà errori di compilazione. Presumo il problema è dovuto alla funzione modello void Fun(const T& val) in grado di prendere SOLO un tipo di T ma un puntatore di funzione.

2> Senza void Func(const char* p), la linea Func("aaa"); funziona correttamente. Presumo il motivo è che il tipo T può essere const char*.

Domanda> Questi argomenti sono giusti?

Grazie

+3

è la prima funzione davvero chiamato divertente e non Func, o è che un errore di battitura? – happydave

+0

@happydave, ho modificato il codice e la domanda. – q0987

+0

Nel secondo caso senza il sovraccarico 'const char *', 'T' è dedotto come' char [4] '. –

risposta

8

std::endl è di per sé un modello di funzione, quindi non si può avere la detrazione modello argomento per Func a meno che effettivamente specifica una funzione. Il seguente dovrebbe funzionare:

Func(static_cast<std::ostream&(&)(std::ostream&)>(std::endl)); 

Un altro modo (grazie a @ 0x499602D2) è quello di specificare gli argomenti di template:

Func(std::endl<char, std::char_traits<char>>); 
+0

Perché la sintassi del cast NON è la seguente? 'Func (static_cast (std :: endl));' – q0987

+0

No, Kerrek ha esplicitamente detto che 'std :: endl' è _non_ quello. Hai davvero preparato la risposta? Vedi, per esempio, [questo] (http://en.cppreference.com/w/cpp/io/manip/endl). – Useless

+0

@Useless, ho rimosso il mio commento. Thx – q0987

Problemi correlati