5

ostream に問題があるため、パラメーターを出力する非常に基本的なマクロを作成しました。

以下のコード例を参照してください。

#define LOG Message(__FILE__, __LINE__,__func__)

class Message : public std::ostringstream 
{
    public:
        Message(const char *param1, int param2, const char *param3)
        {
            *this<<param3<<"("<<param1<<":"<<param2<<")";
        }
        ~Message()
        {
            *this<<endl;
            cout<< rdbuf()->str();
        }
};


int main()
{
    int integer = 1;
    string str = "XYZ";

    LOG<<integer<<"DEBUGLOG1: "<<str<<" "<<integer;
    return 0;
}

問題は、私が使用する場合です:

LOG << "LOG1: " << str << " " << integer;

出力には、値ではなく const char* "LOG1: " の Address* が出力されます。

しかし、私が使用する場合:

LOG << integer << "DEBUGLOG1: " << str << " " << integer;

出力は完全に機能し、整数値と char 値が出力されます。

使用する代わりにostream& operator<< (ostream& out, const char* s );

それは使用していostream& operator<< (const void* val);ますか?

この過負荷を克服するために何ができるかについて、誰かが光を当てることができますか?

前もって感謝します

4

2 に答える 2

5

問題は、それMessage(...)が一時的であることです。一時 は、 の非 const 参照パラメータにバインドできませんoperator<<

などのメンバー関数と演算子でのみ使用できますostream::operator<<(int)

奇妙なことに、メンバー演算子は、非メンバー演算子で使用できる参照を返します。

于 2012-05-24T14:52:11.313 に答える
-1

プリコンパイルして、マクロがどのように解明されているかを確認します。マクロの操作は難しく (そしてお勧めできません...)、これは非常に基本的なデバッグ方法であり、Google や SO にアクセスし続けることを避けるために知っておく必要があります。

私はあなたが望むと信じていますg++ -E

于 2012-05-24T14:53:47.597 に答える