Информация об изменениях

Сообщение Re[3]: Перегрузка operator& от 08.02.2019 14:30

Изменено 08.02.2019 14:31 Vamp

Re[3]: Перегрузка operator&
V>В тестовых примерах у меня сейчас все компилируется, а вот в рабочем коде у меня постоянное срабатывает перегрузка оператора & для A<size> при использовании Enum-а, хотя должно разрешаться с помощью ADL.
V>во — воспроизвел пример

Во-первых, ADL тут вообще не причем. Чтобы было ADL, твоя функция должна жить в том же пространстве имен, что и тип. А у тебя ничего такого и в помине нет — тип живет в глобальном пространстве, функция в impl.

Во-вторых, ты, как мне кажется, не вполне понимаешь механизм работы using-директивы. В твоем случае, она работает как если бы твой оператор & для перечислений находился в глобальном пространстве имен.

В-третьих, в результате всего этого имеем горький катаклизм — в глобальном пространстве имен имеется подходящий оператор &, но в локальном пространстве имен (my) тоже имеется оператор &, и как только компилятор его находит, поиск прекращается. Вариантов исправления на самом деле много, зависит от того, что в конечном итоге тебе надо.
Re[3]: Перегрузка operator&
V>В тестовых примерах у меня сейчас все компилируется, а вот в рабочем коде у меня постоянное срабатывает перегрузка оператора & для A<size> при использовании Enum-а, хотя должно разрешаться с помощью ADL.
V>во — воспроизвел пример

Во-первых, ADL тут вообще не причем. Чтобы было ADL, твоя функция должна жить в том же пространстве имен, что и тип. А у тебя ничего такого и в помине нет — тип живет в глобальном пространстве, функция в impl.

Во-вторых, ты, как мне кажется, не вполне понимаешь механизм работы using-директивы. В твоем случае, она работает как если бы твой оператор & для перечислений находился в глобальном пространстве имен.

В-третьих, в результате всего этого имеем горький катаклизм — в глобальном пространстве имен имеется подходящий оператор &, но в локальном пространстве имен (my) тоже имеется оператор &, и как только компилятор его находит, поиск прекращается. Вариантов исправления на самом деле много, зависит от того, что в конечном итоге тебе надо.

Простейший вариант — вместо using namespace impl делать using impl::operator&. Но в рабочем коде я не уверен, что это то, что тебе надо.