Вероятно, он имел в виду следующее:
struct foo{
friend void bar(foo* z){} //not static, its friend now
};
foo* z;
bar(z); //fine now
Но тогда технически bar()
не внутри foo
. Он по-прежнему во внутреннем пространстве имен foo
.
--
РЕДАКТИРОВАТЬ:
Он действительно имел в виду friend
, как он сказал (курсив мой):
Лучшим примером является функция friend, которая определена внутри типа
И его пример иллюстрирует дальнейшее. Вероятно, вам нужно читать «определено внутри», а не только «внутри».
Слово «определенный» - это все, что имеет значение, потому что похоже, что имя bar
функции вводится в область видимости класса, но на самом деле имя bar
вводится во включающее пространство имен foo
(см. §3.3.1 / 3-4 и §11.3 / 6).
Вот лучший пример:
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
Обратите внимание, что имя bar
, даже если оно введено в пространство имен Demo
, скрыто и, следовательно, не может использоваться извне с помощью обычного поиска по имени:
using namespace Demo; //brings ALL (visible) names from Demo to current scope
bar(NULL); //STILL error - means bar is invisible
Or,
Demo::bar(NULL); //error - not found
Demo::foo::bar(NULL); //error - not found
Надеюсь, это поможет.
person
Nawaz
schedule
06.02.2013
bar
в этом коде, вместо этого он говорит о функциях друзей - person M.M   schedule 08.04.2016