了解ostream过载

Understanding ostream overload

本文关键字:过载 ostream 了解      更新时间:2023-10-16

我很难理解为类重载ostream方法时收到的错误。

.cpp类中的代码

ostream& operator<<(ostream& out, const dateType& d)
{
   out << d.getYear() << "-" << d.getMonth() << "-" << d.getDay()
   return out;
}

我知道这三个getter都能工作,请在我的main.cpp.中测试它们

然而,当我运行这样的程序时:

cout << d1 << endl:

我得到这个错误:

‘std::ostream& dateType::operator<<(std::ostream&, dateType&)’ must take exactly one argument
 ostream& operator<<(ostream&, dateType&);

我为另一个运行良好的程序编写了这样的ostream代码。那么为什么我会在这里得到错误呢?

您将其作为dateType的成员函数编写,而成员operator<<只能接受一个显式参数(因为第一个参数是隐式的,运算符是二进制的)。现在你有一个三个参数operator<<,取隐式dateType,然后是std::ostream&,然后是另一个dateType

以下是成员operator<<的样子:

struct T
{
   operator<<(ostream&);
};

这个问题是,现在有一个operator<<,它在左边T,在右边取流,这与惯例相反。T() << std::cout不对,是吗?

按照惯例,我们为operator<<重载使用名称空间范围,在这里我们可以完全控制参数顺序。

也就是说,不使其成为dateType的成员函数
如果这些getter是private,那么您可能需要将这个新函数设置为dateTypefriend


我为另一个运行良好的程序编写了这样的ostream代码。

不,你/它没有。