我无法理解在为类重载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代码用于另一个工作正常的程序。那么为什么我在这里得到错误呢?
答案 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代码。
不,你没有。