0

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

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;

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

错误 C2678:二进制“<<”:未找到采用“const Logging::Logger”类型的左侧操作数的运算符(或没有可接受的转换)

当然,如果endl一切正常。

我看过以下答案:

重载 operator<< 时 std::endl 的类型未知

我错过了什么?

4

1 回答 1

3

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

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

但是,如果他们不是const类成员并返回 a Logger &,则更好:

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

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

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

于 2016-06-14T10:16:18.303 回答