Boost.Log игнорирует оператор вставки перегруженного потока

У меня есть класс, который я хочу отображать в журнале определенным образом, поэтому я перегрузил его оператор <<:

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.


person lambdas    schedule 10.04.2014    source источник
comment
Не имея более полного представления о том, что вы делаете в своем коде, я предлагаю вам прочитать поиск, зависящий от аргументов.   -  person PlasmaHH    schedule 10.04.2014


Ответы (1)


Я не думаю, что вы можете сделать это с BOOST_LOG_TRIVIAL. Тривиальный логгер использует базовый boost::sources::logger вместо boost::sources::wlogger, вы можете видеть это из тривиальных.hpp и тривиального.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;
}
person jfly    schedule 11.04.2014