Я хотел бы знать, необходимы ли полные квалификационные имена в библиотеке.Использование пространств имен в библиотеках
Например (я отступа пространств имен здесь для удобства чтения):
namespace A {
namespace B {
namespace C {
class Foo { ... };
} // namespace C
::A::B::C::Foo foo;
// or
C::Foo foo
} // namespace B
namespace D {
::A::B::C::Foo foo;
// or
B::C::Foo foo
} // namespace D
} // namespace A
Я не в полной мере понять 3.4 главы стандарта C++, и я видел, что-то я не могу объяснить, в заголовке STL вектора (упрощено для удобства чтения):
namespace std {
template<..
class reverse_iterator
{ ... };
template<..
class vector {
typedef _STD reverse_iterator<const_iterator> const_reverse_iterator;
...
}
}
вещи _STD расширяется до :: зОго :: .. но по моему пониманию имени искать, reverse_iterator бы посмотрел на в векторе первого, то в родительское пространство имен, которое является std. Как могло бы произойти столкновение?
вспомогательный вопрос: что было бы правилами поиска имени для имен в функциях шаблона с аргументами? Я думаю, что квалифицированный идентификатор будет смотреть непосредственно на имена, уже объявленные без ADL, но неквалифицированное имя будет делать ADL, я прав?
Заранее благодарю вас за ответы.
Я всегда полностью квалифицирую свои пространства имен. Это не имеет никакого значения для компилятора, но он значительно облегчает понимание и навигацию кода, когда я возвращаюсь и смотрю на него еще несколько лет спустя. –
Я делаю это иногда только для ясности, но мне было интересно узнать больше о глобальной квалификационной шкале :: A :: ... вместо A ::. У меня есть около 3 уровней пространств имен, которые слишком долго дают полностью квалифицированным именам, чтобы читаемость могла извлечь выгоду из ее ясности. – ThiSpawn