вызов перегруженного ‘QHash (const double

#c #qt #qlist

#c #qt #qlist

Вопрос:

Я получаю эту ошибку, когда пытаюсь преобразовать 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 * . Но double также должен работать.

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

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

Спасибо,

Спешка

Комментарии:

1. Можете ли вы предоставить точное сообщение компилятора?

2. Не могли бы вы также предоставить свою платформу и версию Qt? Это похоже на ошибку Qt.

Ответ №1:

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

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

(См. Faq по C по этому вопросу)

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

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

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