Вызов перегруженного 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 )
в вашем файле имплантации будет достаточно.