2014-02-06 2 views
1

Я начинающий C++, пытаясь учиться на онлайн-видео. В операторах перегрузки примеров в лекции следующий код там, и выдает ошибку<< Ошибка перегрузки оператора в C++

error: no match for 'operator<<' in 'std::cout << operator+(((point&)(& p1)), ((point&)(& p2)))'compilation terminated due to -Wfatal-errors. 

на линии, помеченный комментарий. Может кто-нибудь рассказать, что не так в коде? Я просто пытаюсь объяснить, что профессор объяснил в лекции, но не может скомпилировать.

===============

#include <iostream> 
using namespace std; 


class point{ 
public: 
    double x,y; 
}; 

point operator+ (point& p1, point& p2) 
{ 
    point sum = {p1.x + p2.x, p1.y + p2.y}; 
    return sum; 
} 

ostream& operator<< (ostream& out, point& p) 
{ 
    out << "("<<p.x<<","<<p.y<<")"; 
    return out; 
} 


int main(int argc, const char * argv[]) 
{ 
    point p1 = {2,3}; 
    point p2 = {2,3}; 
    point p3; 
    cout << p1 << p2; 

    cout << p1+p2; // gives a compliation error 
    return 0; 
} 
+0

Спасибо всем. Это сработало. – kaushal

ответ

3

Это просто проблема с константной корректностью. Ваш оператор + возвращает временный код, поэтому вы не можете привязать его к const при вызове operator<<. Сделать подпись:

ostream& operator<< (ostream& out, const point& p) 

Пока вы не должны делать это, чтобы исправить эту ошибку компиляции, вы не сможете добавить const очков, если вы не исправить operator+ аналогично:

point operator+(const point& p1, const point& p2) 
+0

«Ваш оператор + возвращает временный, поэтому вы не можете привязывать к нему неконстантную ссылку при вызове оператора <<» - Это не очевидно. Это где-то в стандарте C++? –

+0

Спасибо Тони за подробное объяснение. – kaushal

+0

@SergiiKhaperskov: он рассмотрен в 8.5.3/5, см. «В противном случае ссылка должна быть ссылкой lvalue на нелетучий const-тип (т. Е. Cv1 должен быть const), или ссылка должна быть ссылкой rvalue». и пример «double & rd2 = 2.0; // error: не lvalue и reference not const». –

0

Изменить тип параметра из point& в const point& для operator+ и operator<<. Ссылка Non-const не может привязываться к временному (который возвращается operator+), и это вызывает ошибку компиляции.

+0

Спасибо за ваше объяснение. Вы ответили первым! :) – kaushal

0

Причина в том, что второй параметр должен быть ссылкой на константу. (вы не хотите, чтобы он менялся, правда?) Итак, это похоже,

std::ostream& operator<< (std::ostream &out, const Point &p) 
{ 
    out << "(" << p.x << ", " << p.y << ")"; 

    return out; 
} 
Смежные вопросы