2013-02-06 18 views
7

Dies ist Follow-up Frage von Does argument dependent lookup only search namespaces or classes too?, in der @ David Rodríguez sagte "ADL wird in den einschließenden Namespace des Typs, und auch innerhalb der Typ selbst aussehen". Vielleicht habe ich ihn falsch verstanden, was er versucht zu sagen, aber ich habe versucht, dieses Beispiel:Sucht ADL nicht statische Elementfunktionen?

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

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

Es ist nicht kompiliert, produziert wird der Fehler „‚bar‘wurde in diesem Gültigkeitsbereich deklariert“. Ist es so, dass ADL die statische Elementfunktion nicht berücksichtigt? Ich meine in dem Beispiel verbundenen Klasse ist foo also würde ADL nicht innerhalb der Klasse aussehen? . Kann mir bitte jemand die Regeln hier vereinfachen?

+1

Bump ... die gepostete Antwort adressiert nicht die Frage, warum ADL nicht 'bar' in diesem Code findet, es geht und spricht stattdessen über Friend-Funktionen –

Antwort

6

Er meinte wohl dies:

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

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

Aber dann ist technisch bar() nicht innerhalbfoo. Es ist immer noch im umschließenden Namespace foo.

-

EDIT:

Er in der Tat friend gemeint, als he said (Hervorhebung von mir):

Das beste Beispiel ist ein Freund Funktion, die innerhalb definiert die Typ

Und sein Beispiel veranschaulicht weiter. Wahrscheinlich müssen Sie "innen definiert" und nicht nur "innen" lesen.

Das Wort „definiert“ ist alles, was den Unterschied macht, weil es wie die der Funktion sieht Namenbar in den Anwendungsbereich der Klasse eingeführt wird, aber in Wirklichkeit der Name bar wird in den umgebenden Namensraum eingeführt von foo (siehe §3.3.1/3-4 und §11.3/6).

Hier ist ein besseres Beispiel:

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 

Beachten Sie, dass der Name bar, obwohl in den Namensraum Demo eingeführt wird, ist versteckt und somit kann nicht von außen mit üblichen Namens- verwendet werden Nachschlag:

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

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

Oder

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

Hoffe, dass hilft.

+0

Aber warum ADL nicht berücksichtigt die statische Funktion innerhalb der Klasse und ADL betrachtet tatsächlich den Umfang der Klasse selbst, ist nicht der Fall? – M3taSpl0it

+0

@ M3taSpl0it: Nein. Wie ich schon sagte, ist es immer noch im umschließenden Namensraum von 'foo'.Eine Freund-Funktion scheint in der Klasse zu sein. Der Name, der im umschließenden Namespacebereich tatsächlich deklariert wurde. – Nawaz

+0

Vielen Dank für die Bestätigung, ich schätze Sie beantworten, können Sie Ihre Aussage mit der Unterstützung von Aussagen in C++ - Standard widersprechen, die meinem Beispiel widersprechen? . Danke – M3taSpl0it

Verwandte Themen