$ 11,4/5 - „[...] Funkcja przyjaciel zdefiniowane w klasie jest w (leksykalne) zakres klasy w którym jest zdefiniowana [...]”Znajomi zamieszanie
Co to oświadczenie oznacza?
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(){}
Co jest mylące jest to, że wezwanie do 'F' z 'A :: F1 jest cichy zrozumiałe. Dlaczego jednak "f" z "A :: f2" jest źle sformułowane, kiedy przyjaciel jest w "leksykalnym" zakresie klasy zaprzyjaźniającej się? Co oznacza zakres "leksykalny"?
W tym samym typie, dlaczego użycie "MYINT" w "f" jest OK? Czy nie powinien to być "A :: MYINT"?
Jeśli dodać parametr typu 'A *' do 'f', to zarówno 'F1' i 'F2' są w stanie znaleźć 'F' z powodu ADL. To jest zrozumiałe.
znajduje się w zakresie (leksykalnym) oznacza, że ma dostęp do zakresu zawierającego. stąd MYINT jest ważny. http://stackoverflow.com/questions/1047454/what-is-lexical-scope, http://stackoverflow.com/questions/991518/c-how-do-i-call-a-friend-template-function- zdefiniowane-wewnątrz-klasy – Anycorn