Почему мой перегруженный оператор запятой не вызывается? - PullRequest
6 голосов
/ 25 февраля 2010

Я пытаюсь перегрузить оператор запятой функцией, не являющейся другом, как этот:

#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


Примечание: Я понимаю, что перегрузка операторов, которая тоже перегружает запятую, сбивает с толку и вовсе не рекомендуется с точки зрения пуриста. Я просто изучаю нюансы C ++ здесь.

1 Ответ

19 голосов
/ 25 февраля 2010
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. Но вы предоставляете только не-1015 * operator,, поэтому будет использоваться определение по умолчанию.

...