2013-02-06 26 views
7

Questa è la domanda successiva da Does argument dependent lookup only search namespaces or classes too?, in cui @David Rodríguez ha dichiarato che "ADL cercherà nello spazio dei nomi incluso del tipo e anche all'interno dello il tipo stesso". Forse ho avuto lo sbagliato ciò che ha cercato di dire, ma mi è stato provare questo esempio:Non ADL ricerca le funzioni membro statiche?

struct foo{ 
    static void bar(foo* z){}  
}; 

int main(){ 
    foo* z; 
    bar(z); 
} 

Non compila, producendo l'errore "‘bar’non è stato dichiarato in questo ambito". È il caso che ADL non consideri la funzione membro statico ?. Voglio dire nella classe associata ad esempio è foo, quindi ADL non dovrebbe apparire all'interno della classe? . Qualcuno può per favore semplificare le regole qui?

+1

Bump ... la risposta postata non affronta la questione del perché ADL non trova 'bar' in questo codice, va e parla invece delle funzioni amico –

risposta

6

probabilmente voleva dire questo:

struct foo{ 
    friend void bar(foo* z){} //not static, its friend now 
}; 

foo* z; 
bar(z); //fine now 

Ma poi tecnicamente bar() non all'internofoo è. È ancora nello spazio dei nomi incluso di foo.

-

EDIT:

Egli infatti intendeva friend, come he said (sottolineatura mia):

L'esempio migliore è un amico funzione che è definita all'interno la type

E il suo esempio illustra ulteriormente. Probabilmente hai bisogno di leggere "definito dentro", piuttosto che solo "dentro".

La parola "definito" è tutto ciò che fa la differenza, perché sembra nome della funzione bar viene introdotto nel campo di applicazione della classe, ma in realtà, il nome bar viene introdotto nel namespace racchiude di foo (vedere §3.3.1/3-4 e §11.3/6).

Ecco un esempio migliore:

namespace Demo 
{ 
    struct foo 
    { 
     friend void bar(foo* z){} 
    }; 
} 

foo *z; 
bar(z); //foo (type of z) is inside Demo, so is bar 
     //(even though bar is defined inside foo!) 

bar(NULL); //error - NULL doesn't help ADL. 
bar(nullptr); //error - nullptr doesn't help ADL. 

bar(static<foo*>(NULL)); //ok - ADL 

Nota che il nome bar, anche se viene introdotto nel namespace Demo, è nascosto, e quindi non può essere utilizzato al di fuori utilizzando al solito nome- ricerca:

using namespace Demo; //brings ALL (visible) names from Demo to current scope 

bar(NULL); //STILL error - means bar is invisible 

Oppure,

Demo::bar(NULL);  //error - not found 
Demo::foo::bar(NULL); //error - not found 

Spero che questo aiuti.

+0

Ma perché ADL non considera la funzione statica all'interno della classe e ADL considera davvero lo scopo della classe stessa, non è il caso? – M3taSpl0it

+0

@ M3taSpl0it: No. Come ho detto, è ancora nello spazio dei nomi che racchiude 'foo'.Una funzione amico sembra essere all'interno della classe. Il nome effettivamente dichiarato nell'ambito del namespace che lo racchiude. – Nawaz

+0

Grazie per la conferma, apprezzo la tua risposta, puoi pls fare il backup della tua dichiarazione con il supporto delle dichiarazioni citate in C++ standard contraddicendo il mio esempio? . Grazie – M3taSpl0it

Problemi correlati