Ошибка при использовании конструктора
class Ctest
{
public:
int Dtest;
Ctest (int _Dtest = 0 ) { Dtest = _Dtest; }
void operator << (Ctest&);
};
void Ctest::operator << (Ctest& _Ctest)
{
Dtest = _Ctest.Dtest;
};
Ctest _Ctest;
int main()
{
_Ctest << Ctest(1);
}
оператор << не хочет работать, как заставить.
error C2679: бинарный "<<": не найден оператор, принимающий правый операнд типа "Ctest" (или приемлемое преобразование отсутствует)
message : может быть "void Ctest::operator <<(Ctest &)"
message : при попытке сопоставить список аргументов "(Ctest, Ctest)"
Ответы (1 шт):
Автор решения: KoVadim
→ Ссылка
В выражении
_Ctest << Ctest(1);
Ctest(1) это rvalue выражение. А дальше оно пытается вызвать перегруженный оператор <<, который принимает по ссылке. А обычная (lvalue) ссылка не может принять rvalue. Что делать? самый просто способ - сделать ссылку на константу
void Ctest::operator << (const Ctest& _Ctest)
{
Dtest = _Ctest.Dtest;
};
или сделать вот такую перегрузку:
void Ctest::operator << (Ctest&& _Ctest)
{
Dtest = _Ctest.Dtest;
};
Я бы делал const& и этого было бы достаточно. Но если объект "тяжелый" и для него можно написать хорошую функцию перемещения, то перегрузка и для rvalue - самое оно.