Вызов перегруженного qHash(const double&) неоднозначен

Я получаю эту ошибку, когда пытаюсь преобразовать QList в QSet.

QList<double> x_pts;
x_pts << 4.1;
x_pts << 2.2;
x_pts << 2.2;
x_pts << 1.3;
qSort(x_pts);
QSet<double> list = x_pts.toSet();

Любая идея, почему я получаю эту ошибку? Он отлично работает, если я изменю тип на int или double *. Но двойной тоже должен работать.

Все, что я хочу сделать, это удалить дубликаты из моего списка. Я хочу найти способ сделать это, не повторяя список самостоятельно.

Будем благодарны за любую помощь в удалении этой ошибки или другую функцию для удаления дубликатов.

Спасибо,

порыв

1 ответ

Ошибка компилятора связана с тем, что Qt просто не определила функцию qHash(), которая принимает значение типа double. Причина этого в том, что, как правило, плохая идея использовать числа с плавающей запятой в качестве ключей в хэше (в этом случае ваш QSet использует хэш для внутреннего использования).

Вы говорите, что пытаетесь удалить дубликаты, но концепция равенства между числами с плавающей запятой нечетка в C++, поскольку оказывается, что довольно трудно сказать, что любые два числа с плавающей запятой действительно равны.

(См. C++ часто задаваемые вопросы относительно этой темы)

Решение вашей проблемы будет либо:

а) Не используйте числа с плавающей запятой

б) Определите свою собственную функцию qHash, которая удовлетворяет требованиям вашей программы таким образом, чтобы она была удовлетворительной. Определение qHash( double ) в вашем файле имплантации будет достаточно.

Другие вопросы по тегам