вызов перегруженного qHash (const double &) неоднозначен - PullRequest
1 голос
/ 07 октября 2011

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

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

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

Спасибо,

Rush

1 Ответ

4 голосов
/ 07 октября 2011

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

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

(см. FAQ по C ++ относительно этой темы)

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

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

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

...