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.
Bump ... wysłana odpowiedź nie dotyczy pytania, dlaczego ADL nie znajduje 'bar' w tym kodzie, chodzi i mówi o funkcjach znajomych zamiast tego –