std :: endl不能使用重载运算符<<虽然实现了专用的非模板功能

时间:2016-06-14 10:13:13

标签: c++ operator-overloading function-pointers std endl

我有一些具有以下功能的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:二进制&#39;&lt;&lt;&#39;:找不到左侧的操作员   类型&#39; const Logging :: Logger&#39;的操作数(或者没有可接受的   转化率)

当然,没有endl一切正常。

我看了下面的答案:

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

我错过了什么?

1 个答案:

答案 0 :(得分:3)

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

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

但是,如果他们不是const班级成员,并且返回Logger &,则会更好:

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

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

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