我在date类中创建了_year、_day和_date作为私有整数
错误:"_year"不是write()中day和mon的类型和类似项
错误:"istr>>"中"operator>>"的重载不明确((const oop244::Date*)this)->oop244::Date::_year"
注意:候选者是:std::basic_stream<_CharT,_Traits>&std::basic_istream<_CharT,_Traits>::运算符>>
std::ostream& Date::write(std::ostream& ostr) const
{
int year,mon,day;
return ostr<<year<< "/" <<mon<< "/" <<day;
this._year=year;
this._mon=mon;
this._day=day;
}
//overloading istream for object Date input
std::istream& Date::read(std::istream& istr)const
{
char c;
istr>>_year>>c>>_mon>>c>>_day;// char c for '/'
if(istr.fail())
_readErrorCode=1;
this->validate();
return istr;
}
//overloading << operator
std::ostream &operator<<(std::ostream& ostr,Date &d)
{
return d->write(ostr);
}
//overloading >> operator
std::istream& operator>>(Date &d,std::istream& istr)
{
return d->read(istr);
}
重载的<lt;运算符函数必须声明为Date类的友元,这样它才能访问Date对象中的私有数据。
friend std::ostream &operator<<(std::ostream& ostr,Date &d)
friend std::ostream &operator<<(std::ostream& ostr,Date &d)
这里有一个你可以参考的例子。
链接到类似示例
坦率地说,您的描述非常糟糕,因为您没有包含所有相关的代码(例如类定义),包含了与您的问题无关的代码,并且在复制实际错误消息时对编译器的错误消息进行了草率的总结。
很明显,您只是随意输入代码,然后想知道为什么它不起作用。你的描述依赖于这里的人是读心术的人,而大多数人不是。
不过,我将为您的代码中的一些问题提供一些建议。
一种是在operator<<()
的定义中
std::ostream &operator<<(std::ostream& ostr,Date &d)
{
return d->write(ostr);
}
在这种情况下,d
是一个引用,但d->write(ostr)
将其视为一个指针。这是无效的。请改用d.write(ostr)
。类似于运算符>>()。
另一个问题是您的Date::write()
std::ostream& Date::write(std::ostream& ostr) const
{
int year,mon,day;
return ostr<<year<< "/" <<mon<< "/" <<day;
this._year=year;
this._mon=mon;
this._day=day;
}
第一条语句创建三个局部变量,year
、month
和day
。在写出它们之前,不会对它们进行初始化。从this._year=year
开始的三行甚至都没有到达,因为函数返回。this
也是一个指针,因此.
运算符无效。函数实际上需要写出_year
、_mon
和_day
的值(可能声明为Date
的成员)。但事实并非如此。