У меня есть класс, который я хочу отображать в журнале определенным образом, поэтому я перегружен <<
оператор:
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.
Я не думаю, что вы можете сделать это с BOOST_LOG_TRIVIAL
, Тривиальный регистратор использует базовый boost::sources::logger
вместо boost::sources::wlogger
Вы можете увидеть это из trivial.hpp и trivial.cpp в исходном файле boost, и я не вижу, как мы можем изменить его, если мы не изменим исходный код. Если вы используете 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;
}
Других решений пока нет …