ОШИБКА: нет совпадения для 'operator << "в' std :: cout - PullRequest
2 голосов
/ 09 марта 2012

Я понимаю, что эта ошибка обычно возникает из-за некоторых синтаксических или типовых проблем, но я не уверен, как решить эту проблему Я думаю, что это может сделать с типом 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 ]

7 голосов
/ 09 марта 2012

Почему ошибка?
Компилятор сообщает об ошибке, поскольку нет перегруженной версии оператора << для обработки типа 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.

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

Решение 2:
Одношаговое Решение.
Альтернативно, вы можете перегрузить << для самого векторного типа:

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

}

Я лично предпочел бы Решение 1. Оно более читабельно и обычно чаще всего уже имеет перегруженный << для используемого типа вектора, и его можно использовать.

2 голосов
/ 09 марта 2012

Использовать итератор 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.

1 голос
/ 09 марта 2012

Оператор "<<" не перегружен для треугольника типа.Вы проверили <a href="https://stackoverflow.com/questions/5707827/no-match-for-operator-in-stdcout"> эту ссылку вне?

1 голос
/ 09 марта 2012

Вам придется создать перегруженную версию 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);

Если указанная выше функция не была определена, то вы получите сообщение об ошибке, как в настоящий момент.

1 голос
/ 09 марта 2012

Чтобы cout мог выводить ваш объект, вы должны сообщить ему, как. Один из способов - перегрузить оператор <<:

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