LINUX.ORG.RU

как разрешить такой ambiguous overload?

 


1

1

Пусть будет три класса A,B,C;

Первый класс знает только о себе:

struct A {
    bool operator==(const A&) const { qDebug() << "A==A"; return true; }
};

Второй класс знает о себе и о классе A:

struct B {
    bool operator==(const B&) const { qDebug() << "B==B"; return true; }
    bool operator==(const A&) const { qDebug() << "B==A"; return true; }
    operator A() const { return A(); }
};

Получилось что A может сравниваться с B, и B может сравниваться с A.

Третий класс знает о себе и о двух предыдущих:

struct C {
    operator A() const { return A(); }
//    operator B() const { return B(); } // <== и вот с этим возникает проблема
    bool operator==(const A&) const { qDebug() << "C==A"; return true; }
    bool operator==(const B&) const { qDebug() << "C==B"; return true; }
};

Хотелось бы что бы все классы могли сравниваться (и другие еще операции) с другими, но при этом когда сравнивается B == C не происходила конвертация до класса A. При закоментированной строке происходит B == (A)C, а должно B == (B)C. Если раскомментировать проблемную строку, то возникает ambiguous overload.

Можно конечно всегда помнить о такой особенности и производить C==B вместо B==C, когда хочется наоборот. Можно ли решить этот конфликт?

Класс А это самый примитивный класс - идентификатор из базы данных, а B и С это разные уровни кэширования подгруженной информации и при выполнении различных операций между собой должны обмениваться дополнительной информацией, что бы потом если что не подгружать ее через другие каналы.

Хотелось бы что бы все классы могли сравниваться (и другие еще операции) с другими, но при этом когда сравнивается B == C не происходила конвертация до класса A

bool operator==(const B& lhs, const C& rhs) { return rhs == lhs; }

Сравнение ассоциативно, надеюсь?

Deleted
()
Ответ на: комментарий от Deleted

Так сработало, спасибо. Пришлось еще пару других во внешний закинуть, из-за конструкторов которые я в примерах не все указал.

От перестановки результат не зависит.

victor79
() автор топика
Ответ на: комментарий от Deleted

А если вопрос чуть расширить, если требуется все вышесказанное но применительно к оператору присвоения. Его внешним не сделать. Как тут поступить?

victor79
() автор топика
Ответ на: комментарий от victor79

Тут остаётся только «рассказать» классу B о классе C. Присвоение же не ассоциативно, как со сравнением здесь не пройдёт

Deleted
()

Чтобы класс неявно не кастовался, задавай explicit операторы

maxis11
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.