2

地獄 !テキストを標準出力に出力するのに役立つクラスを作成しようとしています...とにかく、1つのことを除いてすべてが機能しています。呼び出されたクラスのオブジェクトを作成したとしましょう。これを行うと、すべてが正常に機能します。

out<<"test test"<<std::endl;

そして、私がこれを行うときにも機能します:

out<<QString("another string")<<std::endl;

しかし、この 2 つのことを連鎖させようとすると、次のようになります。

out<<"test test"<<std::endl<<QString("another string")<<std::endl;

非常に大きなエラーが発生しました。最終的には、operator<< が QString 型のパラメーターを受け入れないことを示しています。QString をチェーンしないと問題なく動作するため、これは奇妙です...これも動作します:

out<<"test test"<<std::endl<<"another string"<<std::endl;

この:

out<<QString("another string")<<std::endl<<"test test"<<std::endl;

だから私は自分の operator<< 関数に問題があると思います... operator<< を正しく作成しなかったか、正しい値を返しません。または、他の何かが間違っている可能性があります。とにかく、私はそれを理解できないので、私を助けてくれませんか? 以下はソースコードです:

output.h: http://xx77abs.pastebin.com/b9tVV0AV output.cpp: http://xx77abs.pastebin.com/5QwtZRXc

そしてもちろん、超大きなエラー :D

http://xx77abs.pastebin.com/8mAGWn47

EDIT:あなたが不思議に思っているのは、私は名前空間を使用していないということです...

4

3 に答える 3

1

Qt はまさにこれを行うための関数/クラスを提供しており、それはQDebug. すでに Qt にバインドされているため、使用するのに問題はありません。

于 2011-02-07T15:57:55.053 に答える
1

これは私のためにコンパイルされます(3番目のリンクのコマンドラインを使用):

#include <iostream>
#include <sstream>
#include <QString>

class Output: public std::ostream
{
    friend std::ostream& operator<<(std::ostream &out, const QString var);
private:

    class StreamBuffer: public std::stringbuf
    {
    private:
        std::ostream &out;
        QString prefix;

    public:
        StreamBuffer(std::ostream& str, const QString &p);
         virtual int sync();
    };

    StreamBuffer buffer;

public:
    Output(const QString &prefix);
};
 Output::Output(const QString &prefix) :
    std::ostream(&buffer), buffer(std::cout, prefix)
{

}

Output::StreamBuffer::StreamBuffer(std::ostream& str, const QString &p)
    :out(str)
{
    prefix = p + "-> ";
}

std::ostream& operator<<(std::ostream &out, const QString var)
{
    out<<qPrintable(var);

    return out;
}

int Output::StreamBuffer::sync()
{
    out <<qPrintable(prefix)<< str();
    str("");
    out.flush();
    return 0;
}

int main()
  {
  Output out (QString (">")) ;
  out<<"test test"<<std::endl;
  out<<QString("another string")<<std::endl;
  out<<"test test"<<std::endl<<QString("another string")<<std::endl;
  }

それもあなたのためにコンパイルされている場合は、失敗したコードにモーフィングしてエラーを見つけることができるはずです。

于 2011-02-07T15:43:36.793 に答える
1

名前空間を使用していますか? もしそうなら、特定の名前空間でoperator<<forを定義しましたか? QString上記のコードに問題は見当たりません (ただし、オーバーロードはコピーではなく const 参照を受け入れる必要があります!)

編集:名前空間にある場合は追加する必要があります。削除すると、見つかりません。

EDIT2:operator<<クラス宣言の後に、ヘッダー ファイルに宣言を追加します。コンパイラは、ユーザーが行うまで、このオーバーロードの存在を認識しません。

std::ostream& operator<<(std::ostream &out, const QString& var);
于 2011-02-07T15:09:37.930 に答える