简体   繁体   中英

ERROR: no match for 'operator<<" in 'std::cout

I realize this error is usually due to some syntax or type issues but I am not sure how to solve this problem. I think it may do with the type of findRt.

vector<triangle> findRightTriangles(unsigned long l, unsigned long h) {

<triangle> retval; // storage for return value.

triangle t;    
double what;

for(t.s1 = 3; t.s1 <= h; t.s1++) {
    for(t.s2 = t.s1; t.s2 <= h; t.s2++) {
        what = sqrt((t.s1*t.s1) + (t.s2*t.s2));
        t.s3 = static_cast<unsigned int>(what);
        if(((t.s1*t.s1)+(t.s2*t.s2)) != (t.s3*t.s3) 
            || t.s1+t.s2+t.s3 < l 
                || t.s1+t.s2+t.s3 > h) {
            continue;
        }
        else if(t.s1+t.s2+t.s3 <= h 
            && t.s1+t.s2+t.s3 >= l 
                && t.s1+t.s2 > t.s3 
                    && ((t.s1*t.s1)+(t.s2*t.s2)) == (t.s3*t.s3)) {
            retval.push_back(t);
        }
    }
}
return retval;
}

int main(){

unsigned long min, max;

cin >> min >> max;

    //Here is the problem:
cout << findRightTriangles(min, max) << endl;

return 0;
}

How to output the vector using cout?

Why the error?
The compiler reports an error because there is no overloaded version of << operator to handle the type vector<triangle> which your function findRightTriangles() returns.
<< is overloaded only for most of the built-in data types and not for custom classes.

How to output the vector using cout?
There are two ways:

Solution 1:
A two step procedure:

Step1: You will have to iterate through the vector and cout each contained triangle .

std::vector<triangle>::const_iterator iter= vec.begin();
for(iter; iter != vec.end(); ++iter)
{
    cout<<*iter; //This is what step 2 provides for
}

Step 2: You will have to overload << for the triangle class as well.

ostream& operator<<( ostream& os, const triangle &) {}

Solution 2:
One step Solution.
Alternately, You can overload << for vector type itself:

ostream& operator<<( ostream& os, const vector<triangle>&)
{

}

I would personally prefer the Solution 1. It is more readable & Usually more often than not one would already have an overloaded << for the vector type being used and it could be leveraged.

Use an iterator http://www.cplusplus.com/reference/std/iterator/ .

Example would be

vector<triangle>::iterator it;

cout << "myvector contains:";
for ( it=myvector.begin() ; it < myvector.end(); it++ )
    cout << " " << *it;

cout << endl;

return 0;

This assumes you have an operator<< for the triangle type.

For cout to be able to output your object you have to tell it how. One way is to overload the << operator:

ostream& operator<<( ostream& os, const vector<triangle>& vec ) {
    ...
    ... // here output to os the way you want it to
    os << ...
    return os;
}

You'll have to create an overloaded version of operator<< for std::cout . It would look something like the following:

ostream& operator<<(ostream& out, const vector<triangle>& triangles);

and at the end of the function, you simply do a return out; in order to return the std::ostream object out that was passed as the first argument (in your case that will be std::cout ).

In other words, when you do

MyFoo object;
std::cout << object;

this is "syntactic sugar" for the following function call:

MyFoo object;
operator<<(std::cout, object);

and would call a version of operator<< that looked like:

ostream& operator<<(ostream& out, const MyFoo& my_object);

If the above function was not defined, then you'd get an error like you're currently experiencing.

Operator "<<" is not overloaded for the type triangle. Have you checked this link out?

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM