2011-02-07 23 views
2

地獄!私はstdoutにテキストを出力するのに役立つクラスを作ろうとしています...とにかく、1つのことを除いて、すべてが機能しています。私のクラスのオブジェクトを作成したとしましょう。私は一緒にチェーンにこれら二つの事をしようとすると、このように、QStringのstd :: ostreamとoperator <<を継承するクラス

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

:しかし

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

そして、私はこれを行うときにも動作します:私はこれを行うと、すべてがprefectly作品

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

この超大エラーが発生すると、最終的に演算子< <はQString型のパラメータを受け付けません。私はチェーンのQStringのないとき、それはOK動作するため、それは、奇妙だ...また、この作品:

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

と、この:

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

だから私は、私は私のオペレータ< <機能に問題があると思います...演算子< <を正しく作成しなかったか、正しい値を返さない。あるいは、何かが間違っているかもしれません。とにかく、私はそれを把握することはできませんので、あなたは私を助けることができますか?ベローは、ソースコードである:

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

そしてもちろん、超ビッグエラー:D

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

はEDIT:すべてのためにあなたが不思議私は名前空間を使用していません...

+0

これらのプリントアウトはどこからテストしていますか? 'output.cpp'? –

答えて

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; 
    } 

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

+0

あなたはこの点に感謝=)私はあなたのコードをコンパイルしようとして、それは動作します。それから私は別のファイルに入れて、それは動作しませんでした。次に、私はいくつかのことを試して、その解決策は、演算子<<定義を.cppから.hファイルに移動することであることを発見しました。その後、私は複数の定義についていくつかのエラーがありました。私はoperator <<をインライン関数として宣言して解決しました:)助けてくれてありがとう!! – xx77aBs

+1

ああ、今それは明らかです! 'std :: ostream&operator <<(std :: ostream&out、const QString var)'は単にヘッダファイルで宣言されていません。代わりの解決策は、ヘッダーファイル内の 'extern std :: ostream&operator <<(std :: ostream&out、const QString var);'です。 – TonyK

1

あなたは名前空間を使用していますか?もしあなたなら、特定の名前空間にQStringoperator<<を定義しましたか?私は上記のコードに間違いがありません(オーバーロードはコピーではなくconst参照を受け入れる必要があることを除いて)

EDIT:名前空間にある場合はそれを移動し、そうでない場合は移動しません見つけられた。

EDIT2:クラス宣言の後にヘッダファイルにoperator<<の宣言を追加します。コンパイラは、あなたがするまでこのオーバーロードの存在を知りません。

std::ostream& operator<<(std::ostream &out, const QString& var); 
+0

私は名前空間を使用していません...そしてええ、私は何とかタイプ&;を忘れてしまった)私はそれを修正するよ、おかげで – xx77aBs

1

私は、Qtがこれを行うための関数/クラスを提供していることを強く感じ、それはQDebugと呼ばれています。すでにQtに縛られているので、それを使うのは問題ではありません。

+1

ええ、デバッグ情報としてのみ使用することを意図しています;) – xx77aBs

関連する問題