2011-10-14 17 views
61

¿Qué significa que el compilador usa la búsqueda en dos fases para compilar la clase de plantilla?Búsqueda en dos fases: se necesita una explicación

+1

@Nawaz He escuchado solo acerca de la búsqueda de dos fases, ¿hay algo que me falta? – smallB

+2

Un breve y útil artículo sobre el tema se puede encontrar en http://blog.llvm.org/2009/12/dreaded-two-phase-name-lookup.html –

+1

Véase también http://stackoverflow.com/a/10171507/76722 y http://stackoverflow.com/a/7241548/76722 –

Respuesta

52

plantillas se compilan (al menos) dos veces:

  1. Sin instanciación del código de la plantilla en sí se comprueba la sintaxis.
    Ej: cualquier error de sintaxis errores tales como ; etc.

  2. En el momento de la instanciación (cuando se conoce el tipo exacto), el código de la plantilla se comprueba de nuevo para asegurar que todas las llamadas son válidos para ese tipo particular.
    Por ejemplo: la plantilla puede incorporar llamadas a funciones que pueden no estar presentes para ese tipo en particular.

Esto se llama como Two Phase Lookup.

+38

También tenga en cuenta que la búsqueda de nombres no dependientes se realiza en la primera fase, mientras que la búsqueda de nombres que dependen de un parámetro de plantilla se realiza en el segundo fase. El significado es que si llama a 'sqrt (1)', entonces 'sqrt' necesita ser declarado antes de que se defina la plantilla. Pero si llama a 'sqrt (t)', donde 't' es una instancia de un tipo que es un parámetro de plantilla, entonces' sqrt' no necesita estar visible hasta que se cree una instancia de la plantilla. MSVC no solía hacer esto correctamente: aún así podría no ser lo que sé. –

+11

De todos modos, es por eso que se llama búsqueda * de dos fases * en lugar de solo compilación de dos fases o algo así. Se supone que la primera fase debe hacer más que simplemente verificar la sintaxis, pero MS tuvo algunas dificultades para implementar la primera fase de búsqueda, por lo que lo hicieron todo en la instanciación: http://stackoverflow.com/questions/6273176/what-excaly-is -broken-with-microsoft-visual-cs-two-phase-template-instantia –

+0

@SteveJessop: Eso suena más parecido: la clave es la parte de "búsqueda" de la búsqueda de dos fases. ¡Gracias! –

Cuestiones relacionadas