Наследование префиксных и постфиксных операторов

Рассмотрим следующий код:

// Only prefix operators
struct prefix
{
    prefix& operator--() { return *this; }
    prefix& operator++() { return *this; }
};

// Try to represent prefix & postfix operators via inheritance
struct any : prefix
{
    any operator--(int) { return any(); }
    any operator++(int) { return any(); }
};

int main() {

    any a;

    a--;
    a++;
    --a; // no match for ‘operator--’ (operand type is ‘any’)
    ++a; // no match for ‘operator++’ (operand type is ‘any’)

    return 0;
}

Я попытался создать иерархию классов. Базовый класс, только чтобы реализовать префиксные операторы увеличения / уменьшения. И добавить постфиксные версии в производный класс.

Однако компилятор не может найти префиксную операцию для объекта производного класса.

Почему это происходит, почему префиксные операторы не наследуются?


person αλεχολυτ    schedule 02.07.2014    source источник
comment
Они скрыты в производном классе.   -  person chris    schedule 02.07.2014
comment
Просто поместите все свои операторы в один класс, зачем усложнять его?   -  person Neil Kirk    schedule 02.07.2014
comment
@NeilKirk Просто в учебных целях.   -  person αλεχολυτ    schedule 02.07.2014


Ответы (1)


Используйте следующее, чтобы импортировать скрытые operator-- и operator++ класса prefix:

struct any : prefix
{
    using prefix::operator--;
    using prefix::operator++;
    any operator--(int) { return any(); }
    any operator++(int) { return any(); }
};

Живая демонстрация

Вероятно, это ужасная идея, но, по крайней мере, она будет компилироваться.

person Shoe    schedule 02.07.2014
comment
Почему-то я воспринимал префиксную и постфиксную формы как разные операторы. Но то же самое получается, что функция f(int) в базовом классе и f(double) в производном. Большое спасибо. - person αλεχολυτ; 02.07.2014