1

をオーバーロードしようとし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
4

2 に答える 2

1

出力ストリームを作成しようとしたことに加えて、 QT ドキュメントconstの指示にも従わなかった

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

QT では、(参照ではなく) コピーによって渡される出力演算子が必要です。それには理由がありましたが、それが何だったのか思い出せません。

于 2013-11-12T15:00:11.163 に答える