$ 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(){}
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'?
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
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