Что-то, что меня беспокоило какое-то время:
Текущая мудрость заключается в том, что типы должны храниться в пространстве имен, которое только содержит функции, которые являются частью не-членного интерфейса типа (см. С++ Coding Standards Sutter и Alexandrescu или здесь), чтобы предотвратить использование ADL несвязанных определений.
Означает ли это, что классы all должны иметь собственное пространство имен? Если мы предполагаем, что класс может быть дополнен в будущем добавлением функции, не являющиеся членами, то никогда не может быть безопасным поставить два типа в такое же пространство имен, как и одно из них, может вводить функции, не являющиеся членами которые могут мешать другим.
Я спрашиваю, что пространства имен становятся для меня громоздкими. я написав библиотеку только для заголовка, и я нахожу себя в именах классов, таких как Проект:: Компонент:: class_name:: class_name. Их реализация вспомогательные функции, но поскольку они не могут находиться в одном пространстве имен, они также имеют чтобы быть полностью квалифицированным!
Edit:
В нескольких ответах было высказано предположение о том, что пространства имен С++ - это просто механизм предотвращения столкновений имен. Это не так. В С++ функции, которые принимают параметр, разрешаются с помощью Аргумент зависимого поиска. Это означает, что когда компилятор пытается найти определение функции, которое соответствует имени функции, он будет искать каждую функцию в том же пространстве имен как тип ее параметров (ов) при поиске кандидатов.
Это может иметь непреднамеренные, неприятные последствия, как подробно описано в Скромное предложение: Фиксация ADL. Sutter и Alexandrescu никогда не ставят функцию в том же пространстве имен, что и класс, если она не предназначена для интерфейса этого класса. Я не вижу, как я могу подчиняться этому правилу, если я не готов предоставить каждому классу собственное пространство имен.
Другие предложения очень приветствуются!