10

クラス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;
}

この演算子を正しく機能させるためにオーバーロードする方法がわかりません。何か案が?

4

3 に答える 3

7

演算子 << を名前空間 std で宣言してみてください (ユーザー定義型のインスタンスを渡しているため、これは合法です)。

namespace std {
   ostream& operator<<(ostream& os, const A& a);
}
于 2011-05-13T13:45:59.093 に答える
2

stdユーザー定義の演算子を名前空間に配置するという Alan の提案は機能します。しかし、私はユーザー定義の演算子を名前空間に配置することを好みlog4cxx::helpersます。これも機能します。具体的には、

namespace log4cxx { namespace helpers {
    ostream& operator<<(ostream& os, const A& a);
} }
于 2014-01-10T04:42:20.633 に答える
0

現在利用可能なコンパイラはありませんが、定数文字列で挿入演算子を使用しようとしたことが問題の原因だと思います。"A: " << a

于 2011-05-13T12:15:48.093 に答える