错误:'std :: cout中'运算符<<“不匹配

时间:2012-03-09 19:13:58

标签: c++ cout

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

5 个答案:

答案 0 :(得分:7)

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

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

解决方案1:
两步程序:

第1步:您必须遍历向量,并cout每个包含triangle

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课程也必须 overload <<

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

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

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

}

我个人更喜欢解决方案1.它更具可读性和可读性。通常,对于正在使用的向量类型,通常会有一个重载<<,并且可以利用它。

答案 1 :(得分:2)

使用迭代器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

答案 2 :(得分:1)

要使cout能够输出您的对象,您必须告诉它如何。一种方法是重载<<运算符:

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

答案 3 :(得分:1)

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

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);

如果未定义上述功能,则会出现类似于您目前遇到的错误。

答案 4 :(得分:1)

运营商“&lt;&lt;”没有为类型三角形重载。你检查过this link了吗?