Пользовательский оператор перегрузки << с log4cxx - PullRequest
0 голосов
/ 20 февраля 2019

У меня есть следующий код:

namespace foo {
namespace bar {
class Baz {
protected:
    void print(std::ostream&);
public:
    friend std::ostream& operator<<(std::ostream& o, Baz& b) {
        b.print(o);
        return o;
    }
}}}

Затем в другом файле:

Baz* b = getBaz();
LOG4CXX_INFO(logger, "Baz is " << *b);

Я получаю сообщение об ошибке от gcc со следующим сообщением:

error: cannot bind 'std::basic_ostream<char>' lvalue to 'std::basic_ostream<char>&&'

Кажется, путаница связана с определением этой перегрузки в log4cxx

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

Я попытался изменить свой код следующим образом:

//forward declaration
namespace foo {
namespace bar {
class Baz;
}
}

namespace std {
using foo::bar::Baz;
//implementation in cpp file
std::ostream& operator<<(std::ostream& o, Baz& b);
}

namespace foo {
namespace bar {
class Baz {
protected:
    void print(std::ostream&);
public:
    friend std::ostream& std::operator<<(std::ostream& o, Baz& b);
}}}

Однако код снова не удаетсяс той же ошибкой.Как заставить компилятор использовать мою собственную версию оператора?

1 Ответ

0 голосов
/ 20 февраля 2019

Похоже, что вы должны объявить параметр Baz& как const Baz&, а метод print также должен быть объявлен как const.

namespace foo {
namespace bar {

class Baz {
protected:
    void print(std::ostream&) const;
public:
    friend std::ostream& operator<<(std::ostream& o, const Baz& b) {
        b.print(o);
        return o;
    }
};

}}
...