Ошибка сегментации при перегрузке QDebug :: operator & lt; & lt;

Я пытался перегрузить QDebug::operator<< за std::string, Я знаю, что мы можем отлаживать (используя qDebug ()) std::string объекты, использующие его std::string::c_str() функция, но я хочу избежать ввода .c_str каждый раз.

Вот моя попытка

#include <QDebug>
#include <string>

inline const QDebug& operator<< (const QDebug& qDebugObj, const std::string& str) {
return qDebugObj << str.c_str();
}

int main()
{
std::string s = "4444555";
qDebug() << s;
}

Эта программа производит ошибку сегментации. Что не так с этим кодом?

Вот этот стек:

#1  0x00000037c407a911 in malloc () from /lib64/libc.so.6
#2  0x00000037ca8bd09d in operator new(unsigned long) () from /usr/lib64/libstdc++.so.6
#3  0x00000037ca89c3c9 in std::basic_string<char, std::char_traits<char>, std::allocator<char> >::_Rep::_S_create(unsigned long, unsigned long, std::allocator<char> const&) ()
from /usr/lib64/libstdc++.so.6
#4  0x00000037ca89cde5 in ?? () from /usr/lib64/libstdc++.so.6
#5  0x00000037ca89cf33 in std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&) () from /usr/lib64/libstdc++.so.6
#6  0x00000000004012ca in operator<< (qDebugObj=..., str="4444555") at main.cpp:5

1

Решение

Если вы посмотрите на каждый перегруженный оператор вывода, вы увидите, что никто иметь const Классификатор. В чем ваша проблема, вы пытаетесь изменить постоянный объект. Удалить const квалификация qDebugObject и возвращаемое значение.

Вы должны иметь предупреждения компилятора, кричащие об этом, и если нет, то вам нужно включить больше предупреждений (по крайней мере, используйте -Wall при компиляции с GCC / Clang).


фактический Проблема, как ответил Майк Сеймур в комментарии, состоит в том, что ваша перегрузка будет вызываться рекурсивно, пока вы не получите переполнение стека.

Способ обхода этого может заключаться в преобразовании строки во что-то еще, например, в QString:

return qDebugObj << QString::fromStdString(str);
4

Другие решения

В дополнение к вашей попытке сделать поток вывода constВы также не выполнили инструкции в Документация QT

// with the fixed output operator
inline QDebug operator<<(QDebug dbg, const std::string& str)
{
dbg.nospace() << QString::fromStdString(str);
return dbg.space();
}

QT хочет, чтобы оператор вывода был передан копией (а не ссылкой). Была причина для этого, но я не могу вспомнить, что это было.

1

По вопросам рекламы [email protected]