Я пытаюсь перегрузить оператор запятой с недругом не являющаяся членом функция как это:
#include <iostream>
using std::cout;
using std::endl;
class comma_op
{
int val;
public:
void operator,(const float &rhs)
{
cout << this->val << ", " << rhs << endl;
}
};
void operator,(const float &lhs, const comma_op &rhs)
{
cout << "Reached!\n"; // this gets printed though
rhs, lhs; // reversing this leads to a infinite recursion ;)
}
int main()
{
comma_op obj;
12.5f, obj;
return 0;
}
В основном я пытаюсь получить оператор запятой, применимый от обеих сторон с плаванием. Наличие функции членства только позволяет мне писать obj, float_val
, при наличии дополнительного недруга помощника не являющаяся членом функция позволяет мне писать float_val, obj
; но членская функция оператора не становится названной.
GCC кричит:
comma.cpp: In function ‘void operator,(const float&, const comma_op&)’:
comma.cpp:19: warning: left-hand operand of comma has no effect
comma.cpp:19: warning: right-hand operand of comma has no effect
Примечание: Я понимаю что, перегружая операторы, что также к запятой перегрузки op., сбивает с толку и нисколько не желателен с точки зрения пуриста. Я просто изучаю нюансы C++ здесь.
void operator,(const float &rhs)
Здесь нужен const
.
void operator,(const float &rhs) const {
cout << this->val << ", " << rhs << endl;
}
Причина в том, что
rhs, lhs
вызовет
rhs.operator,(lhs)
Поскольку rhs
является const comma_op&
, метод должен быть const
методом. Но вы предоставили только не const
оператор,
поэтому будет использовано определение по умолчанию.