2014-10-31 66 views
0

我无法理解重载类的ostream方法时收到的错误。在class.cpp了解ostream过载

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

您可能已将其声明为成员。它应该是非会员。 – juanchopanza 2014-10-31 11:20:34

回答

1

您将它写为dateType的成员函数,而成员operator<<可能只接受一个显式参数(因为第一个参数是隐式的,而操作符是二进制的)。目前,您有三种参数operator<<,采取暗示dateType,然后std::ostream&,然后另一个dateType

这里是如何的成员operator<<看起来:

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

这样做的问题是,现在你有一个operator<<,关于需要T留下和右边的流,这是反惯例。 T() << std::cout是不正确的,是吗?

然后,我们使用命名空间范围为我们的operator<<重载,我们可以完全控制参数顺序。

也就是说,不会使其成为dateType的成员函数。
如果这些获得者是private,您可能需要将此新功能设为frienddateType


I wrote an ostream code like this for another program that works fine.

没有你/没有。

+0

谢谢。我没有意识到我的.h文件中的类声明中有我的ostream代码。我把它和我的istream声明都移到类定义之外,而不是唯一剩下的错误是: 'std :: istream&dateType :: operator >>(std :: istream&,dateType&)'必须只有一个参数 istream& dateType :: operator >>(istream&in,dateType&d) 我正确地认为这是相同类型的问题吗? – Blackwell 2014-10-31 11:35:04

+0

@Blackwell:是的。你的'operator >>'仍然是一个成员。 – 2014-10-31 11:36:14

+0

是的,在我发布之后就明白了。非常感谢。 – Blackwell 2014-10-31 11:39:53