クラスAと演算子<<が次のように宣言されているとします。
// 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);
コンパイラが文句を言っています:binary'<<':タイプ'const A'の右側のオペランドをとる演算子が見つかりません(または受け入れ可能な変換がありません)D:\ dev \ cpp \ lib \ apache-log4cxx \ log4cxx \ include \ log4cxx \ helpers \ messagebuffer.h 190
このエラーは私を:の宣言に連れて行き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;
}
この演算子を正しく機能させるためにオーバーロードする方法がわかりません。何か案が?