Вы должны поместить перегрузку оператора в то же пространство имен, что и ваш класс.
Это позволит оператору быть найденным во время разрешения перегрузки с использованием аргументно-зависимого поиска (ну, фактически, поскольку ostream
находится в пространстве имен std
, перегрузка перегрузки также будет найдена, если вы поместите его в пространство имен std
, но нет причин делать это).
С точки зрения передовых методов проектирования, перегрузка оператора является частью интерфейса вашего класса, а не интерфейса ostream
, поэтому он принадлежит к тому же пространству имен, что и ваш класс (см. Также у Херба Саттера). Пространства имен и принцип взаимодействия ).
С точки зрения написания совместимого со стандартами и переносимого кода нельзя перегрузить оператор в пространство имен std
. Хотя вы можете добавить специализации шаблонов для пользовательских объектов в пространство имен std
, вы не можете добавить дополнительные перегрузки функций.