0
votes

This is my main function

int main()
{
    const string filename = "ass10data.txt";   // use your filename here
    ifstream fin(filename.c_str());
    if (!fin)
    {
        cerr << "Unable to open " << filename << endl;
        exit(1);
    }
    string buffer;
    Quadrilateral* ptrQuad;
    while (getline(fin,buffer))
    {
        // Process only valid input
        if (buffer.size() > 1)
        {
            ptrQuad = createQuadrilateralFromString(buffer);
            cout << *ptrQuad << endl;
            delete ptrQuad;
        }
    }
    fin.close();
}

This is the overloaded insertion operator

ostream& operator<<(ostream&out, Quadrilateral *pointerQuad)
{
    if (pointerQuad->getType() == "rectangle")
    {
        out << "Rectangle: sides " << pointerQuad->getFirst() << " and " << pointerQuad->getSecond() << " area=" << pointerQuad->area();
        out << " perimeter=" << pointerQuad->perimeter();
        return out;
    }
    else if(pointerQuad->getType() == "square")
    {
        out << "Square: side "<< pointerQuad->getFirst() << " area="<< pointerQuad->area();
        out << " perimeter=" << pointerQuad->perimeter();
        return out;
    }
    else if(pointerQuad->getType() == "parallelogram")
    {
        out << "Parallelogram: sides " << pointerQuad->getFirst() << " and " << pointerQuad->getSecond() << " area=" << pointerQuad->area();
        out << " perimeter=" << pointerQuad->perimeter();
        return out;
    }
    else if(pointerQuad->getType() == "rhombus")
    {
        out << "Rhombus: side "<< pointerQuad->getFirst() << " area="<< pointerQuad->area();
        out << " perimeter=" << pointerQuad->perimeter();
        return out;
    }
    else
        return out;
}

I'm getting an error message saying "no match for 'operator<<' (operand types are 'std::ostream {aka std::basic_ostream}' and 'Quadrilateral')" and I can't figure out why.

1
*ptrQuad is not a pointer. And please use smart pointers. - LogicStuff
Look up for canonical form. - YSC

1 Answers

0
votes

The insertion operator should take a const reference to the Quadrilateral, not a pointer to it:

ostream& operator<<(ostream&out, Quadrilateral const &pointerQuad)

Of course, that means your function should use the value syntax, not the pointer one too.

if (pointerQuad.getType() == "rectangle")
{
    out << "Rectangle: sides " << pointerQuad.getFirst() << " and " << pointerQuad.getSecond() << " area=" << pointerQuad.area();
    out << " perimeter=" << pointerQuad.perimeter();
    return out;
}
[...]