Я получил кучу моих собственных объектов, которые я послушно положил в моем собственном пространстве имен:Утилиты, используемые в утилите, находятся в том же пространстве имен, что и используемые им типы?
namespace my { struct foo final {}; /* etc. */}
Где я должен поставить не-другу функций, не являющихся членами (т.е., «глобальные» полезности подпрограмм) которые берут мои типы в качестве параметров? Должен ли я также поместить их в my
имен
namespace my { extern void f(const foo&); }
Или есть перевернутое (или падение), чтобы поместить их в глобальном пространстве имен
extern void f(const my::foo&);
В любом случае, аргумент f
является my::foo
, так ли имеет значение, действительно ли сама функция называется ::f()
или my::f()
?
Edit: обратите внимание, что я специально не ищет «Мне нравится глобальный» или «Мне нравится в пространстве имен» (или аналогичный). Скорее, я ищу конкретные технические причины, чтобы предпочесть один подход по сравнению с другим (предполагая, что такие различия существуют на самом деле). Из комментария это звучит как один (??) Фактор для рассмотрения может быть ADL поведение; есть ли другие?
Это вопрос, основанный на принципе мнения, и, таким образом, вне темы для этого сайта. Вы можете подумать о том, чтобы задать свой вопрос на [softwareengineering.stackexchange.com] (http://softwareengineering.stackexchange.com/) – Xirema
Вводя их в том же пространстве имен, что и основной тип аргумента, позволяет ADL найти их, что удобно. Из-за аргументов нет/технических/проблем с их использованием в глобальном пространстве имен. Но когда разрешение имени не работает, эти нерелевантные функции могут эффективно создавать шум в диагностике. –
@ Xirema Я не уверен, что это мнение основано; вполне могут быть технические причины предпочесть один подход по сравнению с другим. –