Ответ 1
В соответствии с Koenig Lookup (С++ Standard 3.4.2) operator<<
будет выполняться поиск в пространствах имен аргументов. Не нужно объявлять его в пространстве имен std
.
Если у меня есть некоторые перегруженные операторы ostream, определенные для локальных объектов библиотеки, нормально ли им перейти в пространство имен std? Если я не объявляю их в пространстве имен std, тогда я должен использовать using ns:: operator <<
.
В качестве возможного последующего вопроса существуют ли какие-либо операторы, которые должны перейти в стандартное или глобальное пространство имен?
В соответствии с Koenig Lookup (С++ Standard 3.4.2) operator<<
будет выполняться поиск в пространствах имен аргументов. Не нужно объявлять его в пространстве имен std
.
operator<<( ..., MyClass )
должен находиться в том же пространстве имен, что и MyClass
. Вы должны думать об этом как о части интерфейса MyClass
, даже если это (обязательно) функция, не являющаяся членом.
Несколько ссылок:
Стандарт С++ явно запрещает вам объявлять свои собственные конструкции в пространстве имен std.
Как правило, плохая практика - объявлять что-либо (типы, операторы и т.д.) как часть пространства имен, которое у вас нет. Это может иметь неожиданные последствия для людей, потребляющих вашу библиотеку. Лучшее решение - определить ваше собственное пространство имен и импортировать как std
, так и ваше пространство имен, когда вам нужно объединить решения.