-3

我一直试图<<为我的列表重载运算符,但我无法输出它。我有以下错误,我不知道如何解决它:

错误:'std::cout << *it (std::_List_const_iterator<_Tp>::operator* with _Tp = Joc)' 中的 'operator<<' 不匹配

这些是我试图重载<<运算符的方法,但它们都不能使用迭代器输出我的列表。我不知道如何解决它。

ostream& Joc::afisare(ostream &os) const
{        
    os << endl;
    os << "Numele jocului:" << this->nume << ' ' << "Stoc:" << this->stoc << ' ' << "Descrierea joc: " << this->Descriere << ' ';
    for(list<string>::const_iterator it = upd.begin(); it != upd.end(); it++)
    {
        os << "Lista:" << *it << endl;
    }
    os << endl;
    return os;
}

ostream& operator<<(ostream &os, Joc &j)
{
    return j.afisare(os);
}

void Joc::afisare() const
{
    cout << "Numele jocului:" << this->nume << ' ' << "Stoc:" << this->stoc << ' ' << "Descrierea joc: " << this->Descriere << ' ';
    for(list<string>::const_iterator it = upd.begin(); it != upd.end(); it++)
    {
        cout << "Lista:" << *it << endl;
    }
}

主要的:

list<Joc> jx;

jx.push_back(j6);
jx.push_back(j7);

for(list<Joc>::const_iterator it = jx.begin(); it != jx.end(); it++)
{
    cout << *it;
}

我尝试使用cout << it->afisare();,但它仍然没有工作。我不知道该怎么办。

我认为问题出在<<操作员上,但我不知道如何解决。

4

1 回答 1

1

您的主循环const_iterator用于迭代jx. 当您取消引用每个迭代器时,您将获得对const Joc对象的引用。

但是,j您的参数operator<<未声明为const,因此编译器找不到operator<<接受 aconst Joc作为输入的重载,因此出现错误消息。

您需要将j参数声明为const

ostream& operator<<(ostream &os, const Joc &j)

有关详细信息,请参阅运算符重载。

话虽如此,您的afisare()重载是复制代码而不是共享代码。我建议另一种实现:

void Joc::afisare(ostream &os) const
{
    os << "Numele jocului:" << this->nume << ' ' << "Stoc:" << this->stoc << ' ' << "Descrierea joc: " << this->Descriere << ' ';
    for(list<string>::const_iterator it = upd.begin(); it != upd.end(); it++)
    {
        os << "Lista:" << *it << endl;
    }
}

void Joc::afisare() const
{
    afisare(cout);
}

ostream& operator<<(ostream &os, const Joc &j)
{
    os << endl;
    j.afisare(os);
    os << endl; 
    return os;
}
于 2018-06-10T16:46:18.183 回答