Проблема в том, что вы не можете перегрузить operator==
следующим образом:
bool operator==(X*, X*);
Это потому, что хотя бы один из аргументов должен иметь тип класса.
Поскольку вы говорите, что выреализовано operator==
, я полагаю, вы сделали что-то вроде этого:
struct X
{
bool operator==(X*) const;
};
Этот оператор никогда не будет вызываться, когда QSet
пытается найти дубликаты, потому что ему нужен левый аргумент типа X
и правыйтипа X*
Я вижу два возможных решения этой проблемы:
- Не храните ваши элементы в качестве указателей (то есть, используя
QSet<X>
).Это позволит вам перегрузить правильные операторы.Это решение, однако, не всегда выполнимо. - Если бы вы могли каким-то образом установить, что существует только один объект с заданным идентификатором, вы можете просто хранить указатели в вас
QSet
без необходимости перегрузки каких-либо операторов илиqHash
function.
Edit : если ваш дизайн позволяет создавать несколько X
-объектов с одинаковым идентификатором, но вы хотите, чтобы в любое время существовал только один такой объект, может быть, лучше использовать QMap
, который отображается от id до X*
.Когда вы создаете новый объект, делайте что-то вроде этого:
QString newId = ...;
delete objectsMap[newId];
objectsMap[newId] = new X(newId);