C++ istream >> 和 ostream << 错误

C++ istream >> and ostream << errors

本文关键字:lt gt ostream 错误 C++ istream      更新时间:2023-10-16

我在date类中创建了_year、_day和_date作为私有整数
错误:"_year"不是write()中day和mon的类型和类似项
错误:"istr>>"中"operator>>"的重载不明确((const oop244::Date*)this)->oop244::Date::_year"

注意:候选者是:std::basic_stream&lt_CharT,_Traits>&std::basic_istream&lt_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;
}

第一条语句创建三个局部变量,yearmonthday。在写出它们之前,不会对它们进行初始化。从this._year=year开始的三行甚至都没有到达,因为函数返回。this也是一个指针,因此.运算符无效。函数实际上需要写出_year_mon_day的值(可能声明为Date的成员)。但事实并非如此。