我试图将QDebug::operator<<重载为std::string。我知道我们可以使用其std::string函数调试(使用qDebug())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

最佳答案

如果查看every overloaded output operator,您将看到没有一个const限定符。这是您的问题,您尝试修改常量对象。删除constqDebugObject限定符和返回值。

您应该对它发出编译器警告,如果没有,则需要启用更多警告(在使用GCC / clang进行编译时至少应使用-Wall)。

迈克·西摩(Mike Seymour)在评论中回答的实际问题是,您的重载将递归调用,直到出现堆栈溢出为止。

绕过的一种方法可能是将字符串转换为其他形式,例如QString:

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

关于c++ - QDebug::operator <<重载时的段错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19932314/

10-13 02:22