Tome un vistazo a excelente artículo de Herb Sutter "Why not specialize function templates?"
Para citar:
"Por último, vamos a centrarnos en las plantillas de función única y considerar las reglas de sobrecarga para ver cuáles conseguir llama en diferentes situaciones de las reglas. son bastante simple, al menos en un nivel alto, y puede expresarse como un sistema de dos clases clásica:
funciones Nontemplate son ciudadanos de primera clase. Se seleccionará una antigua función no estándar simple que coincida con los tipos de parámetros, así como con cualquier plantilla de función, en lugar de una plantilla de función que, de otro modo, sea igual de buena.
Si no hay ciudadanos de primera clase para elegir que sean al menos tan buenos, entonces plantillas de función de fondo como los ciudadanos de segunda clase consulten a continuación. La plantilla base de función que se selecciona depende de cuál es la mejor y es la más especializada (nota importante: este uso de "especializado" no tiene nada que ver con especializaciones de plantilla, es un coloquialismo desafortunado) según un conjunto de reglas arcanas:
Si está claro que hay una plantilla base de función "más especializada", esa se acostumbra. Si esa plantilla base resulta ser especializada para los tipos que se utilizan, se utilizará la especialización, de lo contrario se utilizará la plantilla base instanciada con los tipos correctos.
Si existe un empate para la plantilla base de la función "más especializada", la llamada es ambigua porque el compilador no puede decidir cuál es una mejor coincidencia. El programador tendrá que hacer algo para calificar la llamada y decir cuál se quiere.
Porque si no hay ninguna plantilla base función que se puede hacer para que coincida, la llamada es mala y el programador tendrá que corregir el código."
En el ejemplo de código, como se señalado por David Z., la función no plantilla void num(int a)
se seleccionará porque se corresponde con la primera regla. Cualquier plantilla de función adicional solo se considerará si concuerdan mejor.
funcionan mejor concordancia el argumento se elige primero. – Anycorn
@Anycorn: en C++, ¿está predeterminado elegir la primera función normal? – IndieProgrammer
Permítanme aclarar: si una función normal coincide con el * tipo *, se elegirá. por ejemplo, si fuera 'num (char a)', se elegiría temlate. – Anycorn