メソッドによって返された一時オブジェクトに対してビットシフト演算子を使用しようとすると、問題が発生します。一時的に演算子がオーバーロードされる
Logオブジェクトを一時的に作成し、ビットシフト演算子を使用して、std :: stringstreamオブジェクトに格納される値を追加します。
一時的に破壊すると、std :: stringstreamはその内容をダンプしますが、デストラクタは最初の文字列を追加する前に呼び出されます。
小さな例:
class LogEntry
{
public:
LogEntry(int level) : m_level{level}
{
}
~LogEntry()
{
// dump m_out on destruction
Widget(m_out.str());
}
template <typename T>
LogEntry& operator<<(T& arg)
{
m_out << arg;
return *this;
}
private:
std::stringstream m_out;
const int m_level;
}
そして、これは私がそれを使用する方法です:
LogEntry(LOG_LEVEL_DEFAULT) << "This is a string" << 1234;
これまでのところ、デストラクタはメモリであることを意味し、ビットシフト演算子の前に呼び出されています内容をm_outに追加するときにすでに壊れています。
オペレータが一時的な破壊の前に呼び出されることを確実にする方法を知っている人はいますか?
LogEntry entry(LOG_LEVEL_DEFAULT)<< "これは文字列です。" << 1234;は構文エラーです。あなたが入力する意味がはっきりしません。 – hvd
コンパイルしません: 'error:expected '、' or ';'あなたの意図する使用行に「<<」トークンの前に。 –
さて、コードを編集しました。私は私のIDEでPCにいないので、私は転記ミスを犯したと思います。私は今あなたが質問に対処できることを願っています。 – pabloxrl