了解ostream重载

时间:2014-10-31 11:19:10

标签: c++

我无法理解在为类重载ostream方法时遇到的错误。

class.cpp中的代码

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

我知道所有三个吸气剂都工作,在我的main.cpp中测试它们。

然而,当我运行类似的东西时:

cout << d1 << endl:

我收到此错误:

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

我写了一个像这样的ostream代码用于另一个工作正常的程序。那么为什么我在这里得到错误呢?

1 个答案:

答案 0 :(得分:1)

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

以下是operator<<成员的外观:

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

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

传统上,我们使用命名空间范围来实现operator<<重载,我们可以完全控制参数顺序。

不要使其成为dateType 的成员函数。
如果这些新函数为friend,则可能需要将此新函数设为dateType private


  

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

不,你没有。