2010-09-03 24 views
6

$ 11.4/5 - "[...] Un amico funzione definita in una classe è nel (lessicale) di validità della classe in cui è definito [...]"Amici confusione

Cosa fa questo dichiarazione significa?

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. Ciò che confonde è che la chiamata a 'f' da 'A :: f1' è tranquilla comprensibile. Tuttavia, perché la chiamata a "f" da "A :: f2" è mal formata, quando un amico è in ambito "lessicale" della classe dell'amicizia? Cosa significa "ambito lessicale"?

  2. Allo stesso tipo, perché l'uso di "MYINT" in "f" è OK? Non dovrebbe essere "A :: MYINT"?

Se posso aggiungere un parametro di tipo 'A *' a 'f', allora sia 'F1' e 'F2' sono in grado di trovare 'f' a causa di ADL. Questo è comprensibile.

+2

è in ambito (lessicale) significa che ha accesso a contenere ambito. quindi MYINT è valido. http://stackoverflow.com/questions/1047454/what-is-lexical-scope, http://stackoverflow.com/questions/991518/c-how-do-i-call-a-friend-template-function- definita all'interno-a-classe – Anycorn

risposta

1

Hai citato solo una parte di § 11.4/5. In base ad esso, f() deve essere dichiarato fuori dalla classe prima (la funzione dovrebbe avere lo scope namespace). Prova questo:

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

Per quanto riguarda la seconda domanda, è ok a causa dei citato da voi parte di § 11,4/5. f() obbedisce alle stesse regole per l'associazione dei nomi come funzione membro statico di quella classe e non ha diritti di accesso speciali per i membri di una classe che li include.

0

Ecco il mio interpreation di una parte della mia interrogazione, che è

"Perché MYINT" può essere definito come "MYINT" invece di "A :: MYINT"?

$ 3.4.1/9 afferma - "Nome di ricerca per un nome utilizzato nella definizione di una funzione amico (11.4) definiti in linea nell'amicizia classe di concessione deve procedere come descritto per la ricerca in definizioni di funzioni membro . Se la funzione amico non è definito nella classe di concessione amicizia, ricerca dei nomi nella definizione amico funzione di deve procedere come descritto per la ricerca in funzione membro namespace definizioni."

Nel nostro caso, il nome da cercare è "MYINT" che è un nome non qualificato. La ricerca di questo nome all'interno della definizione dell'amico 'f', che è definita in linea nella classe, verrebbe eseguita nello stesso modo in cui lo sarebbe per le funzioni membro di 'A'.

La mia comprensione è corretta?