错误:没有匹配'运算符<<"在'std::cout

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

本文关键字:lt quot std cout 运算符 错误      更新时间:2023-10-16

我意识到这个错误通常是由于一些语法或类型问题引起的,但我不知道如何解决这个问题。我认为这可能与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;
}

如何使用cout输出矢量?

为什么会出现错误
编译器报告错误,因为没有重载版本的<<运算符来处理函数findRightTriangles()返回的类型vector<triangle>
<<只为大多数内置数据类型重载,而不为自定义类重载。

如何使用cout输出矢量
有两种方式:

解决方案1:
两步程序:

步骤1:您必须遍历向量和每个包含trianglecout

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

步骤2:您还必须triangle类重载<<

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

解决方案2:
一步解决方案
或者,您可以为向量类型本身重载<<

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

我个人更喜欢解决方案1。它更可读&通常情况下,对于所使用的向量类型,已经有一个过载的<<,并且可以利用它。

使用迭代器http://www.cplusplus.com/reference/std/iterator/.

就是一个例子

vector<triangle>::iterator it;
cout << "myvector contains:";
for ( it=myvector.begin() ; it < myvector.end(); it++ )
    cout << " " << *it;
cout << endl;
return 0;

这假设您有一个operator<<作为triangle类型。

cout要想输出对象,必须告诉它如何输出。一种方法是使<<操作员过载:

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

您必须为std::cout创建operator<<的重载版本。它看起来如下:

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

在函数的末尾,您只需执行return out;即可返回作为第一个参数传递的std::ostream对象out(在您的情况下,它将是std::cout)。

换句话说,当你进行时

MyFoo object;
std::cout << object;

这是以下函数调用的"语法糖":

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

并将调用operator<<的一个版本,该版本看起来像:

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

如果上面的函数没有定义,那么你会得到一个错误,就像你现在遇到的一样。

运算符"<<"没有为类型三角形重载。你查过这个链接吗?