Как преобразовать тип T в шаблонной функции к QPointF
я написал для себя функцию для построения кусочно-линейной зависимости. Написал изначально под QPoint, но теперь появилась необходимость применять её также и с QPointF. Попытался написать шаблонную функцию, однако она не компилируется. Судя по ошибкам типа
ошибка: C2664: "bool (const QPoint &,const QPoint &)": невозможно преобразовать аргумент 2 из "T" в "const QPoint &" with [ T=QPointF ],
я понимаю, что компилятор не знает, как ему преобразовать неопределённый тип к QPointF, однако не понимаю, как мне это преобразование определить. Ниже код самой функции.
void plInterpolation(const QVector<T>* orig, QVector<T>* piecewise, const double precision)
{
piecewise->reserve(1000);
typename QVector<T>::const_iterator buf_it1 = orig->begin();
typename QVector<T>::const_iterator buf_it0 = orig->begin();
typename QVector<T>::const_iterator buf_end = orig->end() - 1;
//int j = 0; // текущая позиция вектора piecewise
piecewise->append(*buf_it1);
buf_it1 += 2;
if (buf_it1 > buf_end) {
*piecewise = QVector<T>(1, T(100, 100));
return;
}
while (buf_it1 != buf_end) {
piecewise->append(*buf_it1);
bool isBigger = false;
do {
typename QVector<T>::iterator p_it = piecewise->end() - 1;
double k = static_cast<double>((*p_it).y() - (*(p_it - 1)).y()) / static_cast<double>((*p_it).x() - (*(p_it - 1)).x()); // тангенс угла наклона
double b = static_cast<double>((*(p_it - 1)).y()) - k * (*(p_it - 1)).x();
int piece_size = 0;
typename QVector<T>::const_iterator temp_it = buf_it0;
while (temp_it != buf_it1) {
piece_size++;
temp_it++;
}
temp_it = buf_it0;
for (int i = 0; i < piece_size; i++) {
double x = (*temp_it).x();
double y = x * k + b;
if (abs(y - (*temp_it).y()) > precision) {
isBigger = true;
i = piece_size;
}
temp_it++;
}
if (isBigger) {
*p_it = *(buf_it1 - 1);
buf_it0 = buf_it1 - 1;
buf_it1++; // сейчас buf_it1 указывает на элемент, стоящий за *p_it, поэтому инкрементирую его лишь раз
//piecewise.append(*buf_it1); // здесь сразу добавляю к ломаной новую точку
}
else {
buf_it1++;
if (buf_it1 != buf_end) {
*p_it = *buf_it1; // здесь сразу присваиваю крайней правой точке ломаной новое значение
} else {
isBigger = true;
}
}
} while(!isBigger);
}
return;
}