Как перегрузить оператор ostream <<, чтобы он работал с log4cxx в C ++? - PullRequest
10 голосов
/ 13 мая 2011

Скажем, у меня есть класс A и оператор <<, объявленный так: </p>

// A.h
class A
{
    // A stuff
};
std::ostream& operator<<(std::ostream& os, const A& a);

где-то еще, я использую свой регистратор с A:

LoggerPtr logger(LogManager::getLogger("ThisObject"));
A a;
LOG4CXX_INFO(logger, "A: " << a);

Компилятор жалуется:двоичный файл «<<»: не найден оператор, который принимает правый операнд типа «const A» (или нет допустимого преобразования) D: \ dev \ cpp \ lib \ apache-log4cxx \ log4cxx \ include \ log4cxx \ helpers\ messagebuffer.h 190 </p>

Эта ошибка приводит меня к объявлению макроса operator<<:

// messagebuffer.h
template<class V>
std::basic_ostream<char>& operator<<(CharMessageBuffer& os, const V& val) {
    return ((std::basic_ostream<char>&) os) << val;
}

LOG4XX_INFO, который расширяется до:

#define LOG4CXX_INFO(logger, message) { \
    if (logger->isInfoEnabled()) {\
       ::log4cxx::helpers::MessageBuffer oss_; \
       logger->forcedLog(::log4cxx::Level::getInfo(), oss_.str(oss_ << message), LOG4CXX_LOCATION); }}

MessageBuffer «определяет» и этот оператор:

// messagebuffer.h
template<class V>
std::ostream& operator<<(MessageBuffer& os, const V& val) {
    return ((std::ostream&) os) << val;
}

Я не понимаю, как правильно перегрузить этот оператор, чтобы заставить его работать.Есть идеи?

Ответы [ 3 ]

7 голосов
/ 13 мая 2011

Вы можете попробовать объявить своего оператора << в пространстве имен std (это допустимо, поскольку вы передаете экземпляр вашего пользовательского типа): </p>

namespace std {
   ostream& operator<<(ostream& os, const A& a);
}
2 голосов
/ 10 января 2014

Предложение Алана поместить пользовательский оператор в пространство имен std работает. Но я предпочитаю помещать пользовательский оператор в пространство имен log4cxx::helpers, что также работает. В частности,

namespace log4cxx { namespace helpers {
    ostream& operator<<(ostream& os, const A& a);
} }
0 голосов
/ 13 мая 2011

У меня нет доступного сейчас компилятора, но я думаю, что проблема вызвана попыткой использовать оператор вставки в константную строку. "A: " << a

...