2013-02-06 12 views
7

To jest pytanie uzupełniające z Does argument dependent lookup only search namespaces or classes too?, w którym @David Rodríguez powiedział "ADL będzie wyglądać w otaczającej przestrzeni nazw tego typu, a także wewnątrz sam typ". I może mam mu źle, co próbował powiedzieć, ale starałem ten przykład:Czy ADL nie wyszukuje funkcji elementów statycznych?

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

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

To nie kompiluje, wytwarzające błąd „«bar»był nie zadeklarowane w tym zakresie”. Czy ADL nie uważa funkcji statycznego członka? Chodzi mi o to, że w przykładowej klasie związanej jest foo, więc czy ADL nie zajrzałoby do klasy? . Czy ktoś może uprościć tutaj zasady?

+1

Bump ... wysłana odpowiedź nie dotyczy pytania, dlaczego ADL nie znajduje 'bar' w tym kodzie, chodzi i mówi o funkcjach znajomych zamiast tego –

Odpowiedz

6

Prawdopodobnie oznaczało to:

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

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

Ale technicznie bar() nie wewnątrzfoo jest. Jest to nadal w otaczającej przestrzeni nazw foo.

-

EDIT:

On rzeczywiście oznaczało friend, jak he said kopalni (nacisk):

Najlepszym przykładem jest przyjaciel funkcja, która jest zdefiniowana wewnątrz z typ

I jego przykład ilustruje dalej. Prawdopodobnie musisz przeczytać "zdefiniowany w środku", a nie tylko "wewnątrz".

Słowo „zdefiniowane” jest wszystko, co czyni różnicę, ponieważ wygląda z funkcji nazwabar jest wprowadzany do zakresu klasy, ale w rzeczywistości, nazwa bar jest wprowadzany do przestrzeni nazw okalającego z foo (patrz §3.3.1/3-4 i §11.3/6).

Oto lepszy przykład:

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 

Zauważ, że nazwa bar, chociaż jest wprowadzany do przestrzeni nazw Demo, jest ukryty, a tym samym nie może być używany z zewnątrz za pomocą zwykłej Imieniny Lookup:

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

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

Albo

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

Nadzieję, że pomaga.

+0

Ale dlaczego ADL nie bierze pod uwagę funkcji statycznej wewnątrz klasy , a ADL rzeczywiście rozważa zakres samej klasy, tak nie jest? – M3taSpl0it

+0

@ M3taSpl0it: Nie. Jak już wspomniałem, nadal znajduje się w otaczającym obszarze nazw 'foo'.Funkcja przyjaciela wydaje się znajdować się w klasie. Nazwa faktycznie zadeklarowana w zasięgu otaczającego obszaru nazw. – Nawaz

+0

Dziękuję za potwierdzenie, doceniam twoją odpowiedź, czy możesz wykonać kopię zapasową swojego oświadczenia przy pomocy oświadczeń cytowanych w standardzie C++ zaprzeczających mojemu przykładowi? . Dzięki – M3taSpl0it

Powiązane problemy