2012-03-09 2 views
1

Я понимаю, что эта ошибка, как правило, связана с некоторыми проблемами синтаксиса или типа, но я не уверен, как решить эту проблему. Я думаю, это может быть связано с тип findRt.ОШИБКА: нет соответствия для «operator <<" in 'std :: cout

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?

+1

Что такое 'треугольник'? У этого есть перегрузка для 'operator <<'? –

+0

Вы проверили это? http://stackoverflow.com/questions/5707827/no-match-for-operator-in-stdcout – orezvani

ответ

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: Вы должны overload << для triangle класса, а также.

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

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

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

} 

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

1

Для cout, чтобы иметь возможность выводить ваш объект, вы должны сказать ему, как это сделать. Один из способов заключается в перегрузке << оператора:

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

Возможно, дешевле и просто так сказать 'const vector &'. –

+0

Да! Просто осознал это! Благодарю. – MPortilheiro

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

Если вышеуказанная функция не определена, вы получите ошибку, такую ​​как you'r e в настоящее время.

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 типа.

1

Оператор "< <" не перегружен для треугольника типа. Вы проверили this link?

 Смежные вопросы

  • Нет связанных вопросов^_^