В каких случаях глобальные операторы скрываются в C ++? - PullRequest
2 голосов
/ 30 июня 2011

Я переставляю пространства имен кода в относительно большом проекте C ++. Одна трудность, с которой я продолжаю сталкиваться, заключается в том, что глобальные перегрузки операторов иногда становятся недоступными. Такие вещи, как операторы потока (<< и >>) и операторы равенства (==), иногда единственные изменения, которые вызывают это, переходят от скажем «namespaceA» к «parent :: namespaceA». Пространство имен "родитель" уже существует.

Я могу исправить это, добавив:

using ::operator<<;
using ::operator>>;
using ::operator==;

в затронутых файлах (из "namespaceA"), хотя я был несколько удивлен, увидев эту работу.

Но такое ощущение, что я просто где-то маскирую более глубокую проблему.

Итак, мой вопрос таков: В каких ситуациях вы ожидаете маскировки / сокрытия глобальных операторов?

Примечание: я подозревал, что вложенные пространства имен могут помешать Koenig Lookup сделать свое дело, но некоторые тестовые примеры показали, что это не проблема. Другой потенциально важный момент заключается в том, что все перегруженные глобальные операторы, похоже, являются шаблонными функциями. Однако мне интересно лучше понять, как глобальные операторы пространства имен как-то исчезают ... все ответы приветствуются.

Ясно, что это связано с родительским пространством имен, но я не совсем уверен, что я ищу. Я могу понять, что оператор снова перегружен, так что вызывается неправильная версия, но я получаю ошибки компиляции, которые даже не могут найти операторы с правильной сигнатурой!

Ответы [ 2 ]

1 голос
/ 30 июня 2011

Возможно, вы забыли, как работает поиск по имени.Когда вы используете operator<<, это почти всегда как a << b, а не ::parent::namespaceA::operator<<(a,b).Это безоговорочное использование означает, что его поиск осуществляется с помощью зависимого от аргументов поиска (он же Koenig Lookup).

Таким образом, операторы из глобального пространства имен будут скрыты операторами из пространств имен аргумента.

1 голос
/ 30 июня 2011

Если в пространстве имен есть операторы, они будут найдены, и поиск на этом останавливается.

Неважно, правильные ли это перегрузки или нет.

...