2010-09-03 16 views
6

$ 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(){} 
  1. 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"?

  2. 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.

+2

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

Odpowiedz

1

Cytowałeś tylko część § 11.4/5. Zgodnie z nim f() powinno być zadeklarowane poza klasą (funkcja powinna mieć zakres przestrzeni nazw). Spróbuj tego:

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();}      
}; 

Jeśli chodzi o drugie pytanie, to jest ok, ponieważ cytowany przez ciebie części § 11,4/5. f() przestrzega tych samych reguł dla powiązania nazw jak statyczna funkcja członkowska tej klasy i nie ma specjalnych uprawnień dostępu do członków klasy otaczającej.

0

Oto moja interpreation jednej części mojego zapytania, który jest

„Dlaczego Myint” może być określane jako „ Myint” zamiast „A :: Myint”?

$ 3.4.1/9 stanów - „Nazwa odnośnika do nazwą użytego w definicji funkcji znajomego (11,4) zdefiniowany inline w klasie przyznającego przyjaźni powinien postępować jak opisano dla odnośnika w definicji funkcji członek Jeśli funkcja przyjaciół przyjaciela nie jest zdefiniowana w przyjaźni nadającej klasę , nazwa wyszukiwania w definicji funkcji przyjaciela będzie przebiegać zgodnie z opisem dla funkcji nazw obszarów nazw w definicjach funkcji nazw przestrzeni nazw . "

W naszym przypadku nazwa, którą należy wyszukać, to "MYINT", która jest niekwalifikowaną nazwą. Wyszukiwanie tej nazwy w definicji przyjaciela "f", które jest zdefiniowane w linii w klasie, byłoby zrobione w taki sam sposób, jak w przypadku funkcji składowych "A".

Czy moje zrozumienie jest prawidłowe?