Я нашел исправление, без записи using
для каждого оператора сравнения, который я добавляю в дочерний класс:
Сделайте оператор нечленом и вытащите его в охватывающую область A
(в этом примере глобальная область):
auto operator==(const A&, const B&)
Если вы хотите получить доступ к закрытым членам A
или защищенным из его базовый класс, вы можете сделать оператора другом A
. (То же самое для B
.)
Почему это работает
скрытие (это означает, что если имя найдено в области видимости, оно не будет искать в следующем (те, которые алгоритм поиска рассмотрит на следующем шаге), это не остановит работу, потому что для операторов выполняются два отдельных поиска, последовательно объединяемых:
Для оператора, используемого в выражении (например, operator +, используемого в a + b), выполняются два отдельных поиска: для перегрузок операторов, не являющихся членами, и для перегрузок операторов-членов (для операторов, для которых разрешены обе формы). Эти наборы затем объединяются со встроенными перегрузками операторов на равных основаниях.
- cppreference
Таким образом, не член operator==
пространство имен не помешает поиску BaseA::operator==
, который ищется при поиске оператора-члена, начиная с A
(но сейчас нет operator==
), поэтому переход к следующей области, базовому классу BaseA
.
Этот способ исправления важен для меня, потому что я использую библиотеку строгих типов и просто хотел добавить только один оператор для строгого типа, оборачивая целое число. Я использую библиотеку, чтобы не писать шаблон сам, и все же каждый раз, когда я добавляю оператор, мне приходилось бы use
тот, который есть в библиотеке.