Если мы посмотрим на ваше Bar
определение конструктора:
Foo::Bar::Bar(): Base() {
Baz::boo();
}
Как только часть объявления конструктора (Foo:::Bar::Bar
) была прочитана компилятором, он знает область действия и больше не нужен.
Более интересным примером будет, например,
namespace Foo
{
struct Baz {};
struct Bar
{
Baz fun(Baz);
};
}
Foo::Baz Foo::Bar::fun(Baz)
{
// Irrelevant...
}
Теперь, для определения самой структуры, Baz
не нуждается ни в каком квалификаторе пространства имен, поскольку он определен в пространстве имен, и все символы пространства имен доступны непосредственно.
Определение функции fun
другое. Поскольку он не определен внутри пространства имен, нам необходимо полностью определить структуру Baz
для возвращаемого типа. И то же самое для фактического имени функции. Но затем, как и раньше, когда эта часть читается и анализируется компилятором, он знает область действия и знает, что аргумент Baz
действительно Foo::Baz
.
Вы можете узнать больше о поиске имен в этой ссылке .