std::endl 不适用于重载的运算符<<,尽管实现了专用的非模板函数

std::endl is not working with overloaded operator<< though dedicated non template function is implemented

我有一些 Logging::Logger class 具有以下功能:

template<typename T>
const Logger& Logger::operator<<(const T& in) const {
    // ...
    return *this;
}

const Logger& Logger::operator<<(std::ostream& (*os)(std::ostream&)) {
    // ...
    return *this;
}

以及以下代码:

loggerInstance << "ID: " << 5 << endl;

虽然所有运算符似乎都已实现,但我收到以下错误:

error C2678: binary '<<': no operator found which takes a left-hand operand of type 'const Logging::Logger' (or there is no acceptable conversion)

当然,没有 endl 一切正常。

我查看了以下答案:

std::endl is of unknown type when overloading operator<<

我错过了什么?

因为您的重载运算符 return a const Logger &,因此它们必须是 const class 方法,以便您能够将它们链接在一起:

const Logger& Logger::operator<<(std::ostream& (*os)(std::ostream&)) const

但是,如果他们不是 const class 成员会更好,并且 return 编辑 Logger &,而不是:

template<typename T> Logger& Logger::operator<<(const T& in)

Logger& Logger::operator<<(std::ostream& (*os)(std::ostream&))

这可能是因为,据推测,operator<< 会以某种方式修改 Logger 实例。如果没有,您可以在此处使用 const 对象和方法。