How to overload the ostream operator << to m

2019-01-26 07:36发布

Say I have a class A and an operator<< declared like so:

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

somewhere else I use my logger with A:

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

The compiler is complaining: binary '<<' : no operator found which takes a right-hand operand of type 'const A' (or there is no acceptable conversion) D:\dev\cpp\lib\apache-log4cxx\log4cxx\include\log4cxx\helpers\messagebuffer.h 190

This error takes me to the declaration of the 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 macro expands to:

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

MessageBuffer "defines" this operator as well:

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

I don't understand how to overload this operator the right way to make it work. Any idea?

3条回答
时光不老,我们不散
2楼-- · 2019-01-26 08:00

Alan's suggestion of putting the user-defined operator in the std namespace works. But I prefer putting the user-defined operator in the log4cxx::helpers namespace, which also works. Specifically,

namespace log4cxx { namespace helpers {
    ostream& operator<<(ostream& os, const A& a);
} }
查看更多
爱情/是我丢掉的垃圾
3楼-- · 2019-01-26 08:12

You could try declaring your operator << in namespace std (that's legal, since you're passing an instance of your user-defined type):

namespace std {
   ostream& operator<<(ostream& os, const A& a);
}
查看更多
等我变得足够好
4楼-- · 2019-01-26 08:16

I don't have a compiler available right now but i think the problem is caused by trying to use insert operator on a constant string. "A: " << a

查看更多
登录 后发表回答