Я переставляю пространства имен кода в относительно большом проекте C ++. Одна трудность, с которой я продолжаю сталкиваться, заключается в том, что глобальные перегрузки операторов иногда становятся недоступными. Такие вещи, как операторы потока (<< и >>) и операторы равенства (==), иногда единственные изменения, которые вызывают это, переходят от скажем «namespaceA» к «parent :: namespaceA». Пространство имен "родитель" уже существует.
Я могу исправить это, добавив:
using ::operator<<;
using ::operator>>;
using ::operator==;
в затронутых файлах (из "namespaceA"), хотя я был несколько удивлен, увидев эту работу.
Но такое ощущение, что я просто где-то маскирую более глубокую проблему.
Итак, мой вопрос таков: В каких ситуациях вы ожидаете маскировки / сокрытия глобальных операторов?
Примечание: я подозревал, что вложенные пространства имен могут помешать Koenig Lookup сделать свое дело, но некоторые тестовые примеры показали, что это не проблема. Другой потенциально важный момент заключается в том, что все перегруженные глобальные операторы, похоже, являются шаблонными функциями. Однако мне интересно лучше понять, как глобальные операторы пространства имен как-то исчезают ... все ответы приветствуются.
Ясно, что это связано с родительским пространством имен, но я не совсем уверен, что я ищу. Я могу понять, что оператор снова перегружен, так что вызывается неправильная версия, но я получаю ошибки компиляции, которые даже не могут найти операторы с правильной сигнатурой!