No matching function to call to std::swap - std::swap и QCharRef

381
06 августа 2021, 03:00

Нужно поменять местами последний и предпоследний символы QString. Решил делать через std::swap():

unsigned recursive_damerau(const QString &s1, const QString &s2)
    {
        if (s1 == "")
            return s2.length();
        if (s2 == "")
            return s1.length();
        const char adder = (s1.back() == s2.back());
        unsigned s1_length = s1.length();
        unsigned min_dist;
        QString s1_short = s1, s2_short = s2;
        s1_short.chop(1);
        s2_short.chop(1);
        min_dist = min(min(recursive_damerau(s1, s2_short) + 1, recursive_damerau(s1_short, s2) + 1), recursive_damerau(s1_short, s2_short) + adder);
        if (s1_length != 1) // As it is also not zero, that means >=2
        {
            QString s1_swapped = s1;
            std::swap(s1_swapped[s1_length - 1], s1_swapped[s1_length - 2]);
            min_dist = min(min_dist, recursive_damerau(s1_swapped, s2));
        }
        return min_dist;
    }

Получаю ошибки:
Насколько я понимаю, это потому что QString::operator[] возвращает QCharRef вместо QChar&, который в данном случае неправильно обрабатывается.
Есть ли способ это исправить?

Answer 1

Как вариант

QString str("Hello world");
str.insert(str.size()-2,str[str.size()-1]).chop(1);

Если через стандартную библиотеку, то можно использовать iter_swap:

std::iter_swap(std::end(str)-1, std::end(str)-2);
READ ALSO
Ошибка инициализации в конструкторе C26495

Ошибка инициализации в конструкторе C26495

Пишет Предупреждение C26495 Variable 'Mat::temp' is uninitializedAlways initialize a member variable (type

431
C++ Поля переменной длины в структурах

C++ Поля переменной длины в структурах

Есть, например, такая структура:

112
Квадратные скобки в HTML

Квадратные скобки в HTML

Столкнулся с такой ситуациейПишу на Блогере статью

312