2010-09-03 10 views
6

$ 11.4/5 - "[...] Un amigo función definida en una clase es en el ámbito de aplicación (léxico) de la clase en la que se define [...]"Amigos confusión

Lo que hace esto ¿significa declaración?

struct A{ 
    typedef int MYINT; 
    void f2(){f();}     // Error, 'f' is undefined 
    friend void f(){MYINT mi = 0;}  // Why does this work, shouldn' it be A::MYINT? 
    void f1(){f();}     // Error, 'f' is undefined 
}; 

int main(){} 
  1. Lo que se confunde aquí es que la llamada a 'f' desde 'A :: F1' es tranquila comprensible. Sin embargo, ¿por qué la llamada a 'f' de 'A :: f2' está mal formada, cuando un amigo está en el alcance 'léxico' de la clase de amistad? ¿Qué significa alcance 'léxico'?

  2. En el mismo tipo, ¿por qué es correcto el uso de 'MYINT' en 'f'? ¿No debería ser 'A :: MYINT'?

Si añado un parámetro de tipo 'A *' a 'f', entonces ambos 'F1' y 'F2' son capaces de encontrar 'f' a causa de ADL. Esto es comprensible

+2

en el ámbito (léxico) significa que tiene acceso al ámbito contenedor. por lo tanto, MYINT es válido. http://stackoverflow.com/questions/1047454/what-is-lexical-scope, http://stackoverflow.com/questions/991518/c-how-do-i-call-a-friend-template-function- definido dentro de una clase – Anycorn

Respuesta

1

Usted ha citado solo parte de § 11.4/5. Según él, f() debe declararse fuera de clase primero (la función debe tener un alcance de espacio de nombres). Prueba esto:

void f(); // declare it first 
struct A{ 
    typedef int MYINT; 
    void f2(){f();}      
    friend void f(){MYINT mi = 0;}  // definition of global f, a friend of A 
    void f1(){f();}      
}; 

En cuanto a la segunda pregunta, es aceptable debido a que citado por parte de § 11.4/5. f() obedece a las mismas reglas para el enlace de nombre como una función miembro estática de esa clase y no tiene derechos de acceso especiales para los miembros de una clase adjunta.

0

Aquí es mi interpreation de una parte de mi consulta, que es

"¿Por MYINT" puede ser referido como "MYINT" en lugar de "A :: MYINT"?

$ 3.4.1/9 estados - "búsqueda de nombre para un nombre utilizado en la definición de una función amigo (11.4) definida en línea en la amistad concesión de CLASE I proceder como se describe para las operaciones de búsqueda en definiciones de funciones miembro . Si la función amigo no está definido en la clase amistad concesión, búsqueda de nombre en la definición de función amigo procederá como se describe para la búsqueda en función de miembro del espacio de nombres definiciones ".

En nuestro caso, el nombre que se buscará es 'MYINT', que es un nombre no calificado. La búsqueda de este nombre dentro de la definición del amigo 'f' que se define en línea en la clase se haría de la misma manera que lo sería para las funciones miembro de 'A'.

¿Es correcto mi entendimiento?