0

特定の方法でログに表示したいクラスがあるため、その<<演算子をオーバーロードしました。

class CWindowClassId
{
public:
    // ...
    friend std::wostream& operator<< (std::wostream& os, CWindowClassId const& classId);
}

上記のクラスをログ ストリームに挿入します。

// ...
CWindowClassId classId(hWindow);
BOOST_LOG_TRIVIAL(debug) << "Window created, class = " << classId;

コンパイルエラーが発生します:

Error   1   error C2679: binary '<<' : no operator found which takes a right-hand operand of type 'const Sandbox::CWindowClassId' (or there is no acceptable conversion)    C:\local\boost_1_55_0\boost\log\utility\formatting_ostream.hpp  710

<<エラーは、ワイド文字列をオーバーロードしたという事実にあることを知っています。ostreamの代わりに使用する場合はすべて問題wostreamありませんが、ワイド文字列バージョンを使用したいのです。

シンクのロケールを設定しようとしました:

shared_ptr<log::sinks::synchronous_sink<log::sinks::text_file_backend> > sink = log::add_file_log("log.txt");
sink->imbue(boost::locale::generator()("en_US.UTF-8"));

またBOOST_LOG_USE_WCHAR_T、ログ関連のインクルードの前に定義しています。

ワイド文字列<<演算子でロギングを機能させるためにできることはありますか?

Boost 1.55.0 を使用しています。

4

1 に答える 1

2

でこれを行うことはできないと思いますBOOST_LOG_TRIVIAL。トリビアル ロガーは のboost::sources::logger代わりに基になる を使用しboost::sources::wloggerます。これはブースト ソース ファイルの trivial.hpp と trivial.cpp からわかります。ソース コードを変更しない限り、どのように変更できるかわかりません。を使用するwloggerと、うまくいきます。次に例を示します。

#include <iostream>
#include <string>
#include <boost/log/sources/logger.hpp>
#include <boost/log/common.hpp>

namespace src = boost::log::sources;

class CWindowClassId
{
public:
    // ...
    friend std::wostream& operator<< (std::wostream& os, CWindowClassId const& classId)
    {
        os << classId.ws;
        return os;
    }
public:
    std::wstring ws;
};

int main(int argc, char* argv[])
{
    src::wlogger lg;
    CWindowClassId id;
    id.ws = L"wide char";
    BOOST_LOG(lg) << "Hello, World! This is a wide character message."<<id;
    return 0;
}
于 2014-04-11T03:21:54.690 に答える