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