2017-04-05 3 views
1

にリテラル私はオーバーロードされている演算子を渡す方法:アプリケーションでのロギングの私の特別なタイプのオーバーロードオペレータ

CLogger * operator<<(CLogger *logger, QString &str) 
{ 
    if(logger != nullptr) 
    { 
     logger->getStream()->operator <<(str); 
     return logger; 
    } 
    else 
     return nullptr; 
} 

そして私は、このように、この演算子によってパラメータを渡すためにしようとしている:

&myLog << "Hello"; 

myLogは、私のCLoggerクラスです。私はこのエラーになっています:

invalid operands of types 'CLogger*' and 'const char [6]' to binary 'operator<<' 
    &myLog << "Hello"; 
       ^

をしかし、私はすべてが良いです。この方法としてQStringオブジェクトを渡している場合:

QString hi = "Hello"; 
&myLog << hi; 

どのように私は、直接この文字列リテラル渡すことができますか?

+0

なぜあなたは 'CLogger 'の代わりに' CLogger * 'を使っていますか? – Angew

+0

私はロギングレベルを定義する必要があるので、例えば: '&myLog << LgLevel :: Info <<" Hello ";'グローバルに宣言されたログレベルが 'LgLevel :: Info'のレベルよりも低い場合、nullpointerを返す必要があります。ファイルには何も保存されません。 – drewpol

答えて

3

あなたの問題はオペレータが左端の参照であるQString &strを取ることです。左辺値参照では左辺値(名前付きオブジェクト)を渡す必要があります。

&myLog << "Hello"; 

"Hello"Qstringに名前が付いていないので、あなたはそれにバインドすることはできません。あなたがしたいのは、const QString &strです。 const&は一時的にバインドすることができ、"Hello"を一時的なQstingに変換してから一時的にバインドすることができます。

もう1つの方法は、変換を必要としないconst char*の演算子をオーバーロードし、文字列リテラルを直接操作できるようにすることです。これは、Qstringが行う可能性のある動的メモリ割り当てからあなたを救うことができるので、有利です。


もう一つの問題は、あなたが本当に参照してCLoggerインスタンスに取るべきであるということです。ポインターを使用すると、組み込み型の演算子がオーバーロードされなくなります。これは、ポインターが組み込み型であり、その演算子に過負荷をかけることができないためです。

+0

あなたの答えをありがとう。私は 'const char *'を通してパラメータを渡すことを考えましたが、私が演算子の宣言を変更したとき、私は別のエラーが出ました: 'CLogger * operator <<(CLogger *、const char *) 'はclassまたは列挙型'。 ^ – drewpol

+0

@drewpolちょうどその答えに追加されました。 – NathanOliver

+0

あなたの答えは大変ありがとうございます。私は最初の投稿の上のコメントのポインタを介して私のクラスへのポインタを得ている理由を説明した。 – drewpol

関連する問題