2011-06-01 15 views
7

En Thinking in C++ Volumen 1, capítulo 16: Introducción a plantillas. El contexto:¿Cuál es la diferencia entre el iterador de amigo y el iterador de clase de amigo que encuentro en pensar en C++?

en cuenta que en vez de decir:

friend iterator; // Make it a friend 

Este código tiene:

friend class iterator; // Make it a friend 

Esto es importante porque el nombre " iterador "es alre en el alcance, a partir de un archivo incluido.

¿Qué significa realmente Eckel anteriormente? Parece que friend iterator compila correctamente y no puedo ver las diferencias. ¿Alguien puede decir la respuesta? Gracias

Respuesta

6

Según C++ 03 sección estándar 11.4:

Un elaborado de tipo especificador se usa en una declaración amigo para una clase.

De acuerdo con la especificación, el compilador le advertirá que la declaración de amigo iterator debe ser un nombre de clase elaborado. De lo contrario, el compilador no cumple con el estándar en este aspecto particular.

¿Cuáles son Tipo especificados elaborados?
C++ utiliza especificadores de tipo elaborados para indicar explícitamente al compilador que trate una clase como una clase. Creo que MSDN puede explicarlo mucho mejor que yo, así que revisa this para obtener una explicación detallada.

+0

Quizás una explicación sobre lo que significa 'especificador de tipo elaborado', porque ya sabes, standardese no es para todos. :) – Xeo

+0

@Xeo: Agregué un enlace a MSDN, espero que sea suficiente. :) –

+0

Además, en C++ 0x esta restricción se levantó para los parámetros de la plantilla, por lo que ahora podemos tener 'plantilla clase Final {amigo D; ~ Final() {}}; '. – Xeo

Cuestiones relacionadas