LINUX.ORG.RU

[C++]перегрузка операторов

 


0

0

к примеру есть

class complex
{
....
complex operator-()   {...};
complex operator -(complex &B){...};
}

почему на этом компилятор ругается на

((complex)complex(1,1)-(complex)complex(1,-1))+complex(1,1)

main.cc:52: error: no match for ‘operator-’ in ‘complex(1.0e+0, 1.0e+0) - complex(1.0e+0, -1.0e+0)’
main.cc:29: note: candidates are: complex complex::operator-()
main.cc:36: note:                 complex complex::operator-(complex&)
а если так то нет
class complex
{
....
complex operator-()   {...};
complex operator -(complex B){...};
}

Я так понимаю что в ((complex)complex(1,1)-(complex)complex(1,-1)) второй операнд - временная переменная, твой же оператор берет ссылку. Тебе нужно или сделать complex operator -(const complex &B){...}; или как ты сделал, где будет передана копия в качестве аргумента.

smh ★★★
()
Ответ на: комментарий от smh

Да, верно, -- нельзя передавать константу зашитую в код, через неконстантную ссылку. Только const complex &B и никак не иначе. Тем самым мы говорим компилеру -- метод ни в коем случае не тронет B, а только посмотрит (вот так бы можно было бы гопникам телефон передавать, через const ref), а не константный референс подразумевает возможность изменить обьект, который может вообще будет находится в неизменяемой области памяти (защищенной от записи).

vnovouhov
()
Ответ на: комментарий от vnovouhov

> нельзя передавать константу зашитую в код, через неконстантную ссылку.

там не константа, там временный объект.

Begemoth ★★★★★
()
Ответ на: комментарий от Begemoth

> там не константа, там временный объект.

И то верно, не совсем верно прочел код

vnovouhov
()

-complex operator -(complex &B){...};
+complex operator -(const complex &B){...};

а еще лучше:
-complex operator -(complex &B){...};
+complex operator -(const complex &B) const {...};

и возьми это за правило.

xydo ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.