Пусть будет три класса 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 и С это разные уровни кэширования подгруженной информации и при выполнении различных операций между собой должны обмениваться дополнительной информацией, что бы потом если что не подгружать ее через другие каналы.